見出し画像

Rust 小プロジェクトの大雑把な作り方(1)

昨日の投稿で取り上げた Rust 製個人用コマンドラインツールの制作手順を大雑把に書いてみたいと思います。Rust、というかコンソール向けのツール作成について右も左もわからなかった当時の自分が一番読みたかった内容を書きます。

題材

昨日の投稿に背景的なことが書いてあります。

要は CSV をパースしてプリントするコマンドとして csvprint というのを作ります。

この csvprint の機能的な部分は本投稿の主題ではありませんプロジェクト作成の流れを大雑把ながら解説して雰囲気だけでも伝わればいいな初心者の方がプログラムを書き始めるときの参考になればいいな、というのが主題です。

Git のリポジトリはこちら。

まずやること → cargo new (project_name)

ますやることはプロジェクトを新規作成することです。

僕はホームディレクトリ以下に ~/Study/Rust を作っあるので、その中に練習用プロジェクトを節操なくこしらえていくことにしてます。
練習の時点では、思い立ったことをさっと始められるように多少汚く使っても大丈夫な場所(ディレクトリ)を予め作っておくと便利です。

今回のプロジェクトでは、~/Study/Rust へ移動して cargo でプロジェクトを作成します。このとき命名するプロジェクト名がそのままコマンドラインツールの名前になることを踏まえて命名する必要があります。ここは冷静に名前を考えましょう。今回の課題の場合なら当然 csvprint がプロジェクト名になります。

コンソール(コマンドプロンプト、PowerShell、Bashなど。自分の環境では Windows11 上の GitBash を使用しています。)での入力手順はこんなふうになります。

# コンソール上のコマンド入力。 Bash 系を想定
test -d ~/Study/Rust || mkdir -p ~/Study/Rust # ← なければ作るをやってます。
cd ~/Study/Rust
cargo new csvprint
cd ./csvprint

cargo new は引数に与えたプロジェクト名をそのまま使用したディレクトリを作成してくれます。

README.md を書く

人間は忘れっぽいので、最初に「なにをやるつもりなのか」をメモ程度でOKなので書いておきます。

このとき、適当に memo.txt などを作って書いても、まぁいいのですが、プロジェクトのディレクトリ内に README.md という名前の Markdown ファイルを作りその中にメモを書くと、それが後々そのまま Git リポジトリで説明書きの役割を果たしてくれます。

僕が最初の段階で README.md に書いたのはこんな程度のことです。

# csvprint

ヘッダーありCSVを標準入力から読んで、
標準出力へ次のフォーマットで表示する。
```
<!-- RECORD BEGIN (record number) -->
<!-- COLUMN BEGIN (column name) -->
<!-- COLUMN END   (column name) -->
...
<!-- RECORD END   (record number) -->
...
```

なるべく大雑把なことを先に書いて、詳細は後で付け足していきます。
なんならコードを書いてみないとなんとも判断がつかないこともいっぱいあると思うので、最初に無理やり細かいところまで決めないようにしてます。

最初から必要だとわかってるものだけ Cargo.toml に追記してとりあえずビルド

Rust は cargo new でプロジェクトを作成すると、最初から「hello, world.」をビルドしてランできるようにプロジェクトの基礎が自動作成されます。

このことを利用して、いきなりコードを書き始めることを少し後回しにして事前に必要なこと、やっといたほうが無難なことに取り組むことができます。

そのひとつが依存ライブラリの追加です。

今回の題材である csvprint では当然 CSV フォーマットの解析を行いますので、Rust の csv ライブラリに依存した処理が含まれるのは最初からわかっていることのひとつになります。

※ 「CSV」「csv ライブラリ」の部分は変数的に考えてください。今回は CSV を扱うプロジェクトだから csv ライブラリですが、これが他のフォーマット(JSON とか)だったらそれ用のライブラリを使います。

これを Cargo.toml の [dependencies] のところに追記します。

# Cargo.toml の内容
# 前略
[dependencies]
csv = "1.1"

どのバージョンを追加するのが適切か?は、下記のようなライブラリのリファレンスページへ行って確認し、判断します。

特別な事情がなければ最新版で良いはずです。
この csv ライブラリのように Example が提示されていれば、その動作を自分の環境でも確認してみて、望む機能が実装されているかを確かめてみるのも良いと思います。

さて、 [dependencies] を追記したところで、最初にやってみてほしいのは、

  • cargo build

もしくは、

  • cargo run

です。

src/main.rs 内は hello, world. をプリントする関数が書いてあるだけで依存ライブラリの機能を呼び出すような部分はなにもないと思います。なので、今なら余計なエラーに惑わされずに単純に目的のライブラリが追加可能かを確認できるわけです。

コードを実装し始めると、たいてい「あれがない、これがない、これこれが必要、あーこれは要らなかった」という感じになるのが普通です。
Rust に習熟している人は別として、慣れるまではどの機能(メソッド、トレイトなどなど)がどのライブラリに依存しているかを把握するだけでも大変です。そこに加えて、Cargo.toml 内の記述にスペルミスがあったり、バージョン指定が間違っていたり…などヒューマンエラーも重なってくると、もうなにがなんだかわからなくなってきて嫌になっちゃうと思います。

というわけで、コード上でライブラリの依存のコードを実装する前に一度 cargo run などを走らせてライブラリのダウンロードやプロジェクトへの追加時点でエラーが発生しないかを確認することは結構大事だと思います。

***

今日はこのへんまでにしておこうと思います。

予定は未定ですが、続きは

  • テストを先に書く

  • コードの分割

なんかについて書けたらいいなと思ってます。

SN

この記事が気に入ったらサポートをしてみませんか?