跳到主要内容

工作空间管理

问题

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 workspacenpm workspace
依赖共享共享 Cargo.lock共享 node_modules
版本管理workspace.dependencies各自 package.json
编译缓存共享 target/各自编译
发布cargo publish -p xxx需要 Changesets 等工具

Cargo workspace 的依赖去重和编译缓存共享比 npm 更高效。

相关链接