Rust 用 cargo workspace 搭多 crate 工程:共享依赖、按需编译与统一发布
test12026-10-162 次阅读
什么时候用 workspace
当项目拆成多个互相依赖的 crate(比如一个核心库加多个命令行工具或微服务),把它们放进同一个 workspace 可以共享依赖版本、统一编译缓存、一次性 cargo build。下面是一套典型结构。
根 Cargo.toml
[workspace]
resolver = "2"
members = ["crates/core", "crates/cli", "crates/server"]
[workspace.dependencies]
serde = { version = "1", features = ["derive"] }
tokio = { version = "1", features = ["full"] }
anyhow = "1"
共享核心库
// crates/core/Cargo.toml
[package]
name = "my-core"
version = "0.1.0"
[dependencies]
serde.workspace = true
anyhow.workspace = true
// crates/core/src/lib.rs
use serde::{Serialize, Deserialize};
#[derive(Serialize, Deserialize)]
pub struct Job {
pub id: u64,
pub payload: String,
}
pub fn build_job(id: u64, payload: String) -> Job {
Job { id, payload }
}
依赖核心库的二进制
// crates/cli/Cargo.toml
[package]
name = "my-cli"
version = "0.1.0"
[dependencies]
my-core = { path = "../core" }
tokio.workspace = true
anyhow.workspace = true
// crates/cli/src/main.rs
use my_core::build_job;
fn main() -> anyhow::Result<()> {
let job = build_job(1, "hello".into());
println!("job {} = {}", job.id, job.payload);
Ok(())
}
工程注意点
- 把版本和公用依赖放到 [workspace.dependencies],子 crate 用 .workspace = true 继承,避免版本漂移。
- 只想构建一个成员时用 cargo build -p my-cli,全量用 cargo build。
- 发布单个 crate 用 cargo publish -p my-core,注意依赖顺序。
- workspace 默认共享 target 目录,CI 里缓存它比每个 crate 单独缓存更快。
T
test1
文章作者
什么时候用 workspace 当项目拆成多个互相依赖的 crate(比如一个核心库加多个命令行工具或微服务),把它们...
- 分类
- 技术
- 发布时间
- 2026-10-16
- 字数
- 约 1342 字
- 阅读
- 2 次
