工作空间管理
问题
Rust 多包项目如何组织?
答案
Cargo Workspace 允许在一个仓库中管理多个 crate,共享依赖版本和编译缓存。
工作空间配置
Cargo.toml
[workspace]
members = [
"crates/api",
"crates/core",
"crates/db",
"crates/cli",
]
# 所有成员共享的依赖版本
resolver = "2"
[workspace.dependencies]
tokio = { version = "1", features = ["full"] }
serde = { version = "1", features = ["derive"] }
sqlx = { version = "0.7", features = ["postgres", "runtime-tokio"] }
tracing = "0.1"
crates/api/Cargo.toml
[package]
name = "my-api"
[dependencies]
my-core = { path = "../core" } # 引用工作空间内的 crate
tokio.workspace = true # 使用工作空间统一的版本
serde.workspace = true
推荐项目结构
my-project/
├── Cargo.toml # workspace 根配置
├── Cargo.lock # 共享锁文件
├── crates/
│ ├── api/ # HTTP API 层
│ │ └── src/
│ ├── core/ # 业务逻辑层
│ │ └── src/
│ ├── db/ # 数据访问层
│ │ └── src/
│ └── cli/ # 命令行工具
│ └── src/
├── migrations/ # 数据库迁移
└── tests/ # 集成测试
常用命令
cargo build -p my-api # 只构建指定 crate
cargo test --workspace # 测试所有 crate
cargo clippy --workspace # Lint 所有 crate
常见面试问题
Q1: Cargo workspace 和 npm workspace 有什么异同?
答案:
| 维度 | Cargo workspace | npm workspace |
|---|---|---|
| 依赖共享 | 共享 Cargo.lock | 共享 node_modules |
| 版本管理 | workspace.dependencies | 各自 package.json |
| 编译缓存 | 共享 target/ | 各自编译 |
| 发布 | cargo publish -p xxx | 需要 Changesets 等工具 |
Cargo workspace 的依赖去重和编译缓存共享比 npm 更高效。