Cargo Workspaces を使うことで、複数のクレートをモノレポ的に管理することができます。
その際、workspace.dependencies を使うことで、使用するクレートのバージョンの一元管理することできます。
目次
workspace.dependencies の活用
ここでは、workspace.dependencies を使い、anyhow のバージョンを統一する設定例を紹介します。C
Cargo Workspaces の構成
Cargo Workspaces を使うと以下のような構成を取ることができます。
sample-app
├── crate-a
│ ├── src
│ │ └── ...
│ └── Cargo.toml
├── crate-b
│ ├── src
│ │ └── ...
│ └── Cargo.toml
└── Cargo.tomlCargo.toml
プロジェクトのルートディレクトリにある Cargo.toml に [workspace.dependencies] で anyhow を定義します。
[workspace]
resolver = "2"
members = [ "crate-a", "crate-b" ]
[workspace.dependencies]
anyhow = "1.0.99"各クレートの Cargo.toml
各クレートの Cargo.toml ではanyhow.workspace = true と記述します。
これで、ルートの Cargo.toml で定義したクレートの情報を参照することができます。
[dependencies]
anyhow.workspace = trueもしくは、 { workspace = true } として記述することができます。
[dependencies]
anyhow = { workspace = true }The Cargo Book の Workspaces では、以下のようにサンプルが記載されているので、features などの指定がない場合は crate_name.workspace = true の記述方法がベターかなと思います。
記述量も少ないですし…!
# [PROJECT_DIR]/Cargo.toml
[workspace]
members = ["bar"]
[workspace.dependencies]
cc = "1.0.73"
rand = "0.8.5"
regex = { version = "1.6.0", default-features = false, features = ["std"] }# [PROJECT_DIR]/bar/Cargo.toml
[package]
name = "bar"
version = "0.2.0"
[dependencies]
regex = { workspace = true, features = ["unicode"] }
[build-dependencies]
cc.workspace = true
[dev-dependencies]
rand.workspace = trueまとめ
複数のクレートをモノレポ構成で管理する場合、例に挙げた anyhow や利用頻度の高い serde のようなクレートはバージョンをルートの Cargo.toml で管理できると便利でしょう!


コメント