Rust Cargo workspace
Cargo workspace 如何组织多 crate 单仓库:共享依赖解析、成员路径与发布边界。
#type / concept
#status / growing
#tech / dev
#resource / rust
[!info] 关联笔记
Rust Cargo workspace
这个概念为什么出现
中大型项目常拆:
app二进制core领域库clientSDK
workspace 让它们同仓构建、统一 lock、共享依赖版本策略。
[!abstract] 一句话理解 Workspace 是多个 package 的 Cargo 顶层组织;一次
cargo test --workspace可构建成员集合并共享Cargo.lock(对虚拟清单等规则以 Cargo 书为准)。
最小可运行示例
场景:电商 mono-repo 拆 core + api
目录示意(创建命令):
# 业务意图:一仓两 package。
# 教学点:workspace 成员;路径依赖。
mkdir -p shop && cd shop
cargo new --lib core
cargo new --bin api
根 Cargo.toml 示例:
[workspace]
members = ["core", "api"]
resolver = "2"
api/Cargo.toml 片段:
[dependencies]
core = { path = "../core" }
然后:
cargo test --workspace
cargo run -p api
结合场景再看三个关注点
- 路径依赖 连接成员
-p选择包- 发布时每个 package 独立
核心概念与准确模型
- 虚拟 manifest:根只有 workspace
default-members- 依赖继承(workspace dependencies)现代 Cargo 支持
- 特性与统一 lint 可在 workspace 层配置
设计动机
- 代码复用与边界清晰
- 原子提交跨 crate 改动
- 一致工具链体验
边界与误区
- 循环路径依赖
- workspace 过大构建变慢 → 合理拆分 CI
- 把不该公开的 crate 发布到 crates.io
[!warning] 常见误区:用 workspace 代替模块 小项目单 crate 模块更简单。
工程实践
- 领域边界拆 crate
- 公共依赖 workspace 继承
- CI:fmt/clippy/test workspace
- 版本与发布流水线按 package
本节总结
- 多 crate 同仓
- 路径依赖 + 统一构建
- 边界服务架构
自测题
- 何时不该建 workspace?
cargo run -p name作用?
参考答案
- 单二进制/小库足够时。
- 指定运行 workspace 中某个 package。
延伸阅读与资料来源
| 资料 | 类型 | 支撑内容 |
|---|---|---|
| Cargo Book — Workspaces | 官方 | workspace |
| Cargo Book — Specifying Dependencies | 官方 | path 依赖 |