Cargoの役割
Rustでアプリケーションを開発する際、Cargoというツールを利用することがデファクトスタンダードとなっています。このツールは、Rustアプリケーションのビルドを行ったり、他のライブラリへの依存関係を管理したりします。
Cargoはcargo
コマンドを使って利用します。公式のインストーラを使ってインストールした場合は、Cargoも同時にインストールされています。以下のコマンドでインストールされていることを確認できます。
cargo --version
JS/TSプロジェクトでは公式のビルドシステムというのは無く、何かしらのバンドラツール(例:Vite)を頼ることになります。
ライブラリの依存関係は公式のnpmやサードパーティーのyarn・pnpmを使うことが一般的です。
Rustにおいてはそのどちらも公式ツールとして機能提供されていることが特徴的です。
cargo new
Cargoを使うには、そのプロジェクトが、前提となる構造に従っている必要があります。cargo
には、その構造通りにプロジェクトを作成するサブコマンドが用意されています。
以下のコマンドで、カレントディレクトリの配下に新しいプロジェクトディレクトリを作成できます。
# qiita-sampleの部分は任意
cargo new qiita-sample
コマンドを実行すると、カレントディレクトリにqiita-sample
というディレクトリが生成され、その中に必要なファイルやディレクトリが生成されています。
cargo new
によって生成されるのは以下のものです(厳密にはGitの初期化も行われるので.git
や.gitignore
も含まれますが、ここでは省略します)。
Cargo.toml
-
src
ディレクトリ
Cargo.toml
Cargoプロジェクトの設定ファイルです。パッケージ名やバージョン、依存関係を管理します。
Node.jsプロジェクトにおけるpackage.json
のようなものです。
src
ディレクトリ
ソースコードが格納されるディレクトリです。Cargoは基本的にsrc
ディレクトリ配下のソースコードをビルド対象にするので、新規にファイルを追加する場合はsrc
ディレクトリ配下に作成しましょう。
src
ディレクトリの中にはmain.rs
が生成されています。Cargoでは、src/main.rs
がエントリーポイントになります。cargo new
直後のsrc/main.rs
の中身は以下のようになっています。
fn main() {
println!("Hello, world!");
}
cargo build
とcargo run
プロジェクトディレクトリ(前項でいうqiita-sample
ディレクトリ)で以下のコマンドを実行すると、プロジェクトをビルドします。
cargo build
このコマンドによるビルド成果物はtarget/debug/qiita-sample
に生成されます。このファイルを実行すると、src/main.rs
のmain
関数の処理を実行できます。
root@k4nd4windows:/work/rust/qiita-sample# ./target/debug/qiita-sample
Hello, world!
ビルドと実行を同時に行いたい場合は以下のコマンドでそれが可能です。
cargo run
Cargoによるコンパイルは、ソースコードに変更があったときに行われるため、すでにcargo build
によってコンパイル済みのバイナリがあり、そのときとファイルが変わっていなければ、コンパイルのフェーズは実行されません。
cargo build
には--release
というオプションが存在します。このオプションを付与すると、プロダクションリリース向けに、より最適化されたバイナリを生成します(サイズが小さくなり、高速になる)。ただし、その最適化フェーズによってコンパイラ時間は増大します。
開発時により早いサイクルでビルドしたい場合は単にcargo build
を、最終的なプロダクションリリースをするときはcargo build --release
を実行します。
cargo check
でコンパイラエラーだけ検証できる
cargo build
やcargo run
を実行したときに、例えばソースコードに誤りがあるとコンパイラエラーが出力され、そうでないときはビルドやバイナリの実行まで進みます。コンパイラエラーが存在するかどうかのみを検証する(=検証に成功すればそこでコマンドが終了してよい)場合はcargo check
というコマンドを使用します。
cargo check
cargo check
の具体的なユースケースを考えてみましたが、例えばGit hooksを組み合わせてコミット前に実行し、コンパイルエラーが発生しないソースコードを保証する、などがあるでしょうか。
似たようなケースを過去のNode.jsプロジェクトでやっていた経験があります。