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.rssome_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の方で宣言されていなければならない。

programming/rust/directory_structure.txt · 最終更新: 2019/08/08 by ikatakos
CC Attribution 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0