rs.nkmk.me

Rust, cargo runでsrc/main.rs以外のファイルを実行

Posted: | Tags: Rust, Cargo

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>

pathCargo.tomlがあるディレクトリからの相対パス。

cargo buildやcargo checkへの影響

バイナリターゲットが複数ある場合、cargo buildcargo checkではすべてのファイルに対してビルドやチェックが実行される。

個別のファイルのみを対象としたい場合は、--binオプションを指定する。

$ cargo build --bin <name>

関連カテゴリー