Cargo のworkspaceセクションを使います。このセクションにmembersというキーを追加し、その値にはパッケージ名を文字列にした配列を置きます。例えばそれは以下のようになります。
[workspace]
members = [
"plus-one",
"there-is-plus-one-as-dependency"
]このファイルはルートとなるディレクトリでcargo initを実行し生成されたCargo.tomlを編集するといいと思います。
plus-oneはモジュールで、there-is-plus-one-as-dependencyはそれを使うメイン処理を書く場所という想定です。この想定で例を見てみます。
plus-one モジュール
モジュールも Cargo でひな形が作れます。それはcargo init --lib <workspace-name>で作れます。つまり今回の場合、cargo init --lib plus-oneになります。
実行後ディレクトリにplus-one/と、その中にsrc/lib.rsファイルができてます。中身を書き換えます。
pub fn plus_one(num: i32) -> i32 {
num + 1
}
#[cfg(test)]
mod tests {
#[test]
fn plus_one_works() {
assert_eq!(34, crate::plus_one(33));
}
}plus_one関数を定義しました。これは数値を与えると+1した値を返してくれる関数です。
一応テストも書いています。ワークスペースなプロジェクトではルートディレクトリでcargo testするだけで各ワークスペースでテストを走らせてくれます。
cargo test
# ...
# running 1 test
# test tests::plus_one_works ... ok
# ...次に上の関数を使うワークスペース作ります。プロジェクトルートディレクトリで、今度はcargo initつまり--lib無しで作ります。
cargo init there-is-plus-one-as-dependencyまた同じようにthere-is-plus-one-as-dependency/ができsrc/main.rsが作られたのでこのファイルでplus_one関数を使ってみます。
fn main() {
println!("{}", plus_one::plus_one(33));
}上記の通り単にモジュール名から関数を辿って使うだけです。plus_oneから辿っているのは-は_に変換される為です。
メイン処理もプロジェクトルートディレクトリからcargo runで使えます。34と出てくれば完璧です。
➜ cargo run
Compiling there-is-plus-one-as-dependency v0.1.0 (/private/tmp/monorepo/there-is-plus-one-as-dependency)
Finished dev [unoptimized + debuginfo] target(s) in 0.56s
Running `target/debug/there-is-plus-one-as-dependency`
34