Rustで複数の実行バイナリを作成する
通常、Cargoを使うと、srcにあるmain.rs
がバイナリ、lib.rs
がライブラリの、それぞれ唯一のコードの起点となる。
. ├── Cargo.lock ├── Cargo.toml ├── benches │ └── large-input.rs ├── examples │ └── simple.rs ├── src │ ├── bin │ │ └── another_executable.rs │ ├── lib.rs │ ├── main.rs │ └── some_nice_modules.rs └── tests └── some-integration-tests.rs
1つのプロジェクトで複数の実行バイナリを作成したい場合は、2通りの方法があるようだ。
src/bin
上図の通り、src/bin
に任意のRustコード(another_executable.rs
)を置くと、main.rs
に加えてそれをコード起点とした実行バイナリも、ファイルと同名で作成される。
Cargo.toml
Cargo.tomlに以下のように[[bin]]
セクションを作ると、それを起点とした実行バイナリも、nameに指定した名前で作成される。
- Cargo.toml
[[bin]] name = "another_executable" path = "src/another_executable.rs"
部分的にコードを共有したい
複数の実行バイナリでコードを共有するにあたり、どこかに共有コードを置きたい。
しかし、例えば上図src/bin/another_executable.rs
から、some_nice_modules.rs
は、直接見に行くことはできない。
この時、lib.rs
でsome_nice_modules.rs
を公開しておき、another_executable.rs
では全体のプロジェクト名を使ってインポートすると、使えるようだ。
pub mod some_nice_modules;
pub fn hello_world() { println!("Hello, world!"); }
[package] name = "hogehoge" # ←ここで全体のプロジェクト名が指定されている authors = [...略]
extern crate hogehoge; use hogehoge::some_nice_modules::{hello_world}; hello_world();
この時、インポートして使うcrateは起点となるファイルで宣言されてなければならないので、some_nice_modules.rs
で使うものはlib.rs
の方で宣言されていなければならない。