Rust Cargo工作区管理工具cargo-workspaces的使用,高效管理多Crate项目的依赖与构建
以下是基于您提供内容的完整示例demo,展示如何使用cargo-workspaces管理多crate项目:
# 1. 创建工作区目录并初始化
mkdir rust-monorepo
cd rust-monorepo
cargo ws init
# 初始化后目录结构:
# rust-monorepo/
# ├── Cargo.toml (工作区配置文件)
# └── .git/
# 2. 创建三个crate:两个库和一个二进制应用
cargo ws create --lib core # 核心库
cargo ws create --lib utils # 工具库
cargo ws create --bin app # 主应用程序
# 3. 配置依赖关系
# 编辑app/Cargo.toml添加依赖:
[dependencies]
core = { path = "../core" }
utils = { path = "../utils" }
# 4. 列出工作区所有crates (带详细信息)
cargo ws list --long
# 示例输出:
# core (path: ./core, version: 0.1.0, private: false)
# utils (path: ./utils, version: 0.1.0, private: false)
# app (path: ./app, version: 0.1.0, private: false)
# 5. 在所有crate中运行测试
cargo ws exec cargo test
# 6. 开发过程中查看变更的crates
git add .
git commit -m "Initial implementation"
# 修改一些文件后...
cargo ws changed
# 只会列出有文件变更的crates
# 7. 版本控制 (统一版本)
cargo ws version patch -y
# 所有crate版本从0.1.0变为0.1.1
# 8. 发布到crates.io
cargo ws publish --dry-run # 先测试
cargo ws publish # 实际发布
# 9. 设置独立版本控制
# 编辑utils/Cargo.toml添加:
[package.metadata.workspaces]
independent = true
# 10. 单独更新utils版本
cargo ws version minor --from utils -y
# utils版本变为0.2.0,其他crate保持0.1.1
# 11. 单独发布utils
cargo ws publish --from utils
# 12. 重命名core crate
cargo ws rename "new-%n" --from core
# core重命名为new-core
项目结构最终如下:
rust-monorepo/
├── Cargo.toml
├── app/
│ ├── Cargo.toml
│ └── src/
│ └── main.rs
├── new-core/ # 重命名后的core
│ ├── Cargo.toml
│ └── src/
│ └── lib.rs
└── utils/
├── Cargo.toml
└── src/
└── lib.rs
关键点说明:
cargo ws init
创建的工作区会自动设置好Cargo.toml的工作区配置- 通过路径依赖(
path = "../xxx"
)管理工作区内部依赖 independent = true
允许特定crate独立版本控制- 所有管理操作都可以针对整个工作区或特定crate执行
1 回复
Rust Cargo工作区管理工具cargo-workspaces的使用
介绍
cargo-workspaces
是一个用于管理Cargo工作区的工具,它可以帮助开发者更高效地处理包含多个crate的项目。这个工具特别适合大型项目或需要维护多个相关crate的开发者,它提供了批量操作、依赖管理和版本控制等功能。
安装
cargo install cargo-workspaces
基本使用方法
1. 创建工作区
cargo workspaces init
这会在当前目录创建一个新的Cargo工作区,并生成基本的Cargo.toml
配置。
2. 添加成员crate
cargo workspaces add my-crate
3. 列出工作区中的所有crate
cargo workspaces list
4. 批量构建所有crate
cargo workspaces build
高级功能
批量运行命令
cargo workspaces run -- test
这会在所有crate中运行cargo test
命令。
依赖管理
cargo workspaces add-dependency serde --features derive
这会在所有crate中添加serde依赖。
版本管理
cargo workspaces version patch
这会将所有crate的版本号增加一个patch版本(如1.0.0 → 1.0.1)
示例项目结构
my-workspace/
├── Cargo.toml
├── crate-a/
│ ├── Cargo.toml
│ └── src/
├── crate-b/
│ ├── Cargo.toml
│ └── src/
└── crate-c/
├── Cargo.toml
└── src/
工作区Cargo.toml示例
[workspace]
members = [
"crate-a",
"crate-b",
"crate-c",
]
resolver = "2" # 使用新的特性解析器
实用技巧
- 使用
--exclude
参数排除特定crate:
cargo workspaces build --exclude crate-c
- 并行构建:
cargo workspaces build --parallel
- 仅构建有变化的crate:
cargo workspaces build --changed
cargo workspaces publish
完整示例demo
下面是一个完整的使用cargo-workspaces的工作区示例:
- 首先创建工作区和三个crate:
# 创建工作区
cargo workspaces init my-workspace
cd my-workspace
# 添加三个crate
cargo workspaces add crate-a --lib
cargo workspaces add crate-b --lib
cargo workspaces add crate-c --bin
- 工作区目录结构如下:
my-workspace/
├── Cargo.toml
├── crate-a/
│ ├── Cargo.toml
│ └── src/
│ └── lib.rs
├── crate-b/
│ ├── Cargo.toml
│ └── src/
│ └── lib.rs
└── crate-c/
├── Cargo.toml
└── src/
└── main.rs
- 工作区Cargo.toml内容:
[workspace]
members = [
"crate-a",
"crate-b",
"crate-c",
]
resolver = "2"
- 为所有crate添加依赖:
cargo workspaces add-dependency serde --features derive
cargo workspaces add-dependency tokio --features full
- 批量构建和测试:
# 构建所有crate
cargo workspaces build
# 测试所有crate
cargo workspaces run -- test
# 仅构建crate-a和crate-b
cargo workspaces build --exclude crate-c
- 版本管理:
# 将所有crate版本升级为0.1.0
cargo workspaces version 0.1.0
# 将所有crate版本增加一个patch版本
cargo workspaces version patch
cargo workspaces publish
cargo-workspaces
极大地简化了多crate项目的管理工作,使得依赖同步、版本控制和批量操作变得更加容易。