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 次