ここではワークスペースの構築方法を紹介している。
大きなプログラムは小さなパッケージに分割して作るのが推奨される。
ワークスペースはそれらのパッケージを管理するディレクトリである。
cargo.toml
とその設定項目
ワークスペースディレクトリの直下には cargo.toml
ファイルを置かなければならない。このファイルでは、ワークスペース全体のための設定、そして後述するルートパッケージがあればその設定、について記載する。
workspace.members
workspace.dependencies
workspace.resolver
package
dependencies
workspace.resolver
にはリゾルババージョンを指定する。これは package.edition
の指定がある場合は自動で導出されるが、そうでない場合は明示的な指定が推奨されている。
ワークスペースの主役になるパッケージがある場合、それをルートパッケージにすると良い。例えば、アプリの主要な実行ファイルを生成するパッケージや、ライブラリ群のコアになる必須ライブラリを生成するパッケージは、ルートパッケージとして適切だろう。
ルートパッケージのアイテム、他パッケージのディレクトリ、これらが並んで配置される。
以下では、src
と tests
はルートパッケージ用で、sub
は同名のパッケージ用である。
my_app/ ├─ cargo.toml ├─ src/... ├─ tests/... └─ sub/...
cargo.toml
ファイルワークスペース用の項目の他、ルートパッケージ用の項目を指定する。
以下では、ルートパッケージと sub
を配下のパッケージとして指定している。
[package]
name = "my_app"
edition = "2021"
version = "0.1.0"
[dependencies]
sub = { path = "sub" }
log = { workspace = true }
rand = "0.8"
[workspace]
members = ["sub"]
[workspace.dependencies]
log = "0.4"
適切なルートパッケージがない場合について。
各パッケージのためのディレクトリはどれも並んで配置される。
以下では、app
と sub
はそれぞれ同名のパッケージ用である。
my_app/ ├─ cargo.toml ├─ app/... └─ sub/...
cargo.toml
ファイルワークスペースのための項目のみを指定する。
以下では、app
と sub
を配下のパッケージとして指定している。
[workspace]
members = ["app", "sub"]
resolver = "2"
[workspace.dependencies]
log = "0.4"
まずは、ルートディレクトリにてコマンド cargo new
をバイナリモードで実行する。
例えば、前述の例で導入したパッケージ app
を作成する場合、以下のようにする。
> cargo new app --bin
続いて、生成されたディレクトリ内のファイルを雛形にコードを作成する。
例えば、以下ではワークスペース側から依存関係を流用したコードになっている。
[package]
name = "app"
edition = "2021"
version = "0.1.0"
[dependencies]
sub = { path = "../sub" }
log = { workspace = true }
rand = "0.8"
use sub::*;
fn main() {
/* Do etc... */
println!("{}", hello());
}
まずは、ルートディレクトリにてコマンド cargo new
をライブラリモードで実行する。
例えば、前述の例で導入したパッケージ sub
を作成する場合、以下のようにする。
> cargo new sub --lib
続いて、生成されたディレクトリ内のファイルを雛形にコードを作成する。
例えば、以下ではワークスペース側から依存関係を流用したコードになっている。
[package]
name = "sub"
edition = "2021"
version = "0.1.0"
[dependencies]
log = { workspace = true }
rand = "0.8"
pub fn hello() -> String {
/* Do etc... */
"hello".to_string()
}