Rust Cargo workspace

Cargo workspace 如何组织多 crate 单仓库:共享依赖解析、成员路径与发布边界。

#type / concept #status / growing #tech / dev #resource / rust

[!info] 关联笔记

Rust Cargo workspace

这个概念为什么出现

中大型项目常拆:

  • app 二进制
  • core 领域库
  • client SDK

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

结合场景再看三个关注点

  1. 路径依赖 连接成员
  2. -p 选择包
  3. 发布时每个 package 独立

核心概念与准确模型

  • 虚拟 manifest:根只有 workspace
  • default-members
  • 依赖继承(workspace dependencies)现代 Cargo 支持
  • 特性与统一 lint 可在 workspace 层配置

设计动机

  • 代码复用与边界清晰
  • 原子提交跨 crate 改动
  • 一致工具链体验

边界与误区

  • 循环路径依赖
  • workspace 过大构建变慢 → 合理拆分 CI
  • 把不该公开的 crate 发布到 crates.io

[!warning] 常见误区:用 workspace 代替模块 小项目单 crate 模块更简单。

工程实践

  1. 领域边界拆 crate
  2. 公共依赖 workspace 继承
  3. CI:fmt/clippy/test workspace
  4. 版本与发布流水线按 package

本节总结

  • 多 crate 同仓
  • 路径依赖 + 统一构建
  • 边界服务架构

自测题

  1. 何时不该建 workspace?
  2. cargo run -p name 作用?
参考答案
  1. 单二进制/小库足够时。
  2. 指定运行 workspace 中某个 package。

延伸阅读与资料来源

资料类型支撑内容
Cargo Book — Workspaces官方workspace
Cargo Book — Specifying Dependencies官方path 依赖
创建于 2026/7/15 更新于 2026/7/15