Rust, cargo runでsrc/main.rs以外のファイルを実行
RustのCargoでcargo runコマンドを実行すると、デフォルトではsrc/main.rsがコンパイル・実行される。
ここでは、src/main.rs以外のファイルを実行する方法について説明する。
例えば、VSCode + rust-analyzer(拡張機能)では、cargo run --bin <bin-name>で実行できるファイルのmain関数の上にrunボタンが表示され、簡単に実行できる。
学習用に小さいコードを色々試してみたい場合はsrc/binに.rsファイルを作っていくのがオススメ。
cargo run --bin
cargo runでは、実行するターゲット(バイナリターゲット)を--binオプションで指定できる。
$ cargo run --bin <bin-name>
以降で説明するように、ターゲットにはsrc/binに置いたファイル名やCargo.tomlに記述した名前を指定できる。
なお、src/main.rsはパッケージ名(Cargo.tomlの[package]のname)がターゲット名となる。ターゲットが複数ある場合は明示的にパッケージ名を指定する必要がある。
$ cargo run --bin <package-name>
Cargo.tomlの[package]のdefault-runにターゲット名を指定すると、オプション無しのcargo runでそれが実行される。
src/binに.rsファイルを置く
src/binディレクトリに.rsファイルを置くと、ファイル名(拡張子なし)がターゲット名となる。
src/bin内にサブディレクトリを作成することもできる。サブディレクトリ内にはmain.rsが必要。ディレクトリ名がターゲット名となる。
src/bin/<file-name>.rsおよびsrc/bin/<dir-name>/main.rsを、以下のコマンドで実行できる。
$ cargo run --bin <file-name>
$ cargo run --bin <dir-name>
具体的な例として以下のレイアウトを考える。
.
├── Cargo.lock
├── Cargo.toml
└── src/
├── lib.rs
├── main.rs
└── bin/
├── named-executable.rs
├── another-executable.rs
└── multi-file-executable/
├── main.rs
└── some_module.rs
以下のコマンドでそれぞれのファイルを実行できる。
$ cargo run --bin named-executable
$ cargo run --bin another-executable
$ cargo run --bin multi-file-executable
上述のように、ターゲットが複数ある場合は--binで明示的にターゲットを指定する必要がある。src/main.rsはパッケージ名(Cargo.tomlの[package]のname)がターゲット名となる。
$ cargo run --bin <package-name>
Cargo.tomlの[[bin]]に設定を記述
src/bin以外のファイルを実行したい場合、Cargo.tomlの[[bin]]セクションに設定を記述する。[[bin]]セクションは複数あってもよい。
[[bin]]
name = "<name>"
path = "path/to/file.rs"
以下のコマンドで実行できる。
$ cargo run --bin <name>
pathはCargo.tomlがあるディレクトリからの相対パス。
cargo buildやcargo checkへの影響
バイナリターゲットが複数ある場合、cargo buildやcargo checkではすべてのファイルに対してビルドやチェックが実行される。
個別のファイルのみを対象としたい場合は、--binオプションを指定する。
$ cargo build --bin <name>