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.toml
Cargo.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
で管理できると便利でしょう!
コメント