bigywater.tech
Rust · 154

Workspace 依赖管理

一个仓库里有多个 crate,怎么管理依赖版本?哪些东西是共享的?继承是自动的吗?这篇搭一个三成员的工作区,逐项验证锁文件、target、继承机制、统一修改与编译次数。

1 个
工作区里的 Cargo.lock 与 target 目录数量
3 对 1
独立项目与工作区里 itoa 的编译次数
逐项继承
license 只在声明了 license.workspace = true 的成员里生效

一个工作区三个 crate

实测 · 本机执行输出
  cargo build --workspace 编译的 crate(按顺序):
    Compiling itoa v1.0.18
    Compiling u154_core v0.5.0 (<实验目录>/proj/u154/crates/core)
    Compiling u154_util v0.5.0 (<实验目录>/proj/u154/crates/util)
    Compiling u154_cli v0.5.0 (<实验目录>/proj/u154/crates/cli)
  工作区里的 Cargo.lock 个数:1;成员目录里是否有自己的 target / Cargo.lock:False
  itoa 在 Cargo.lock 里出现 1 次(三个成员共用同一份)

Cargo.lock 的细节见Cargo.lock 的作用;依赖解析规则见Cargo.toml 依赖解析。

继承的结果

实测 · 本机执行输出
  u154_core  version 0.5.0  edition 2024  license MIT  依赖 ['itoa^1']
  u154_util  version 0.5.0  edition 2024  license None  依赖 ['u154_core* (path)', 'itoa^1']
  u154_cli   version 0.5.0  edition 2024  license None  依赖 ['u154_util* (path)']

改一处全体生效

实测 · 本机执行输出
  版本: {'u154_cli': '0.6.0', 'u154_core': '0.6.0', 'u154_util': '0.6.0'}
  itoa 解析为: ['1.0.9']

-p 与工作区根

实测 · 本机执行输出
  cargo build -p u154_core         编译了 ['itoa', 'u154_core']
  cargo build -p u154_util         编译了 ['u154_util']
  在 crates/util 目录里 cargo build    编译了 []
  在 crates/util 目录运行 cargo 时用的是哪个 target / lock: target 在工作区根 | 成员目录下 Cargo.lock: False

Crate、Package 与 Workspace 的概念见Crate、Package 与 Workspace。

与独立项目对比

实测 · 本机执行输出
  3 个独立项目(各用各的 target 目录)合计 Compiling itoa 出现 3 次
  工作区(三个成员都依赖 itoa)Compiling itoa 出现 1 次

分步演示

Workspace 依赖管理
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / rustc 1.98.1(brew)/ cargo 1.98.1;单个文件用 rustc 直接编译,需要依赖时用 cargo(经代理从 crates.io 下载);计时用 std::time::Instant,数字每次运行会有小幅抖动。itoa 来自 crates.io,三个成员是本地 path crate
    • 没有验证:虚拟工作区(根没有 package)与有根 package 的区别、default-members、[workspace.lints] 继承、成员间 feature 统一、publish 时 workspace 依赖被替换成版本号的行为、发布顺序
    京ICP备2026067502号-1京公网安备11010502063487号