通常、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に任意のRustコード(another_executable.rs)を置くと、main.rsに加えてそれをコード起点とした実行バイナリも、ファイルと同名で作成される。
Cargo.tomlに以下のように[[bin]]セクションを作ると、それを起点とした実行バイナリも、nameに指定した名前で作成される。
[[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の方で宣言されていなければならない。