Cargo工作区如何统一配置包依赖与工作区依赖避免重复?
统一Rust工作区依赖配置的方案
我正在试验一种Rust工作区目录结构:项目根目录下包含src和crates文件夹,其中crates存放工作区成员项目,src则是供所有crates/*成员共享的公共库。
为了让crates/*中的成员能复用依赖版本,我使用x = { workspace = true }的方式继承工作区依赖。但引入工作区成员后,必须把可继承的依赖移到[workspace.dependencies]下;而根目录的src对应的库却需要从[dependencies]读取依赖,这导致我必须重复配置相同的依赖项,虽然功能正常但不够优雅。
有没有办法把两者的依赖配置统一到同一个区块下?
原配置代码
# ROOT/Cargo.toml [workspace] members = ["crates/kvs-client", "crates/kvs-server"] [dependencies] clap = { version = "4.1.6", features = ["derive"] } dotenv = "0.15.0" env_logger = "0.10.0" lazy_static = "1.4.0" log = "0.4.20" ron = "0.8.1" serde = { version = "1.0.188", features = ["derive"] } serde_json = "1.0.104" thiserror = "1.0.38" [workspace.dependencies] kvs = { path = "." } clap = { version = "4.1.6", features = ["derive"] } dotenv = "0.15.0" env_logger = "0.10.0" lazy_static = "1.4.0" log = "0.4.20" ron = "0.8.1"
解决方案:让根目录库也继承工作区依赖
其实根目录的公共库也可以通过workspace = true的方式继承[workspace.dependencies]中的配置,不需要在[dependencies]下重复声明所有依赖项。
修改后的配置如下:
# ROOT/Cargo.toml [workspace] members = ["crates/kvs-client", "crates/kvs-server"] # 根目录库的依赖全部通过继承工作区配置实现 [dependencies] clap = { workspace = true } dotenv = { workspace = true } env_logger = { workspace = true } lazy_static = { workspace = true } log = { workspace = true } ron = { workspace = true } serde = { workspace = true, features = ["derive"] } serde_json = { workspace = true } thiserror = { workspace = true } [workspace.dependencies] kvs = { path = "." } clap = { version = "4.1.6", features = ["derive"] } dotenv = "0.15.0" env_logger = "0.10.0" lazy_static = "1.4.0" log = "0.4.20" ron = "0.8.1" serde = { version = "1.0.188" } serde_json = "1.0.104" thiserror = "1.0.38"
说明
- 把所有公共依赖的版本、基础配置统一放到
[workspace.dependencies]中,只在这里维护一份 - 根目录的
[dependencies]和crates/*中的成员依赖都通过{ workspace = true }继承配置 - 如果根目录库需要额外的特性(比如serde的
derive),可以在[dependencies]的对应项中补充声明,不会覆盖工作区的基础配置
这样就能实现所有依赖配置的统一管理,避免重复编写相同的依赖声明。
内容的提问来源于stack exchange,提问作者dodo
相关产品推荐
相关产品推荐

