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

关键点说明:

  1. cargo ws init 创建的工作区会自动设置好Cargo.toml的工作区配置
  2. 通过路径依赖(path = "../xxx")管理工作区内部依赖
  3. independent = true 允许特定crate独立版本控制
  4. 所有管理操作都可以针对整个工作区或特定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"  # 使用新的特性解析器

实用技巧

  1. 使用--exclude参数排除特定crate:
cargo workspaces build --exclude crate-c
  1. 并行构建:
cargo workspaces build --parallel
  1. 仅构建有变化的crate:
cargo workspaces build --changed
  1. 发布所有crate到crates.io
cargo workspaces publish

完整示例demo

下面是一个完整的使用cargo-workspaces的工作区示例:

  1. 首先创建工作区和三个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
  1. 工作区目录结构如下:
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
  1. 工作区Cargo.toml内容:
[workspace]
members = [
    "crate-a",
    "crate-b",
    "crate-c",
]
resolver = "2"
  1. 为所有crate添加依赖:
cargo workspaces add-dependency serde --features derive
cargo workspaces add-dependency tokio --features full
  1. 批量构建和测试:
# 构建所有crate
cargo workspaces build

# 测试所有crate
cargo workspaces run -- test

# 仅构建crate-a和crate-b
cargo workspaces build --exclude crate-c
  1. 版本管理:
# 将所有crate版本升级为0.1.0
cargo workspaces version 0.1.0

# 将所有crate版本增加一个patch版本
cargo workspaces version patch
  1. 发布到crates.io
cargo workspaces publish

cargo-workspaces极大地简化了多crate项目的管理工作,使得依赖同步、版本控制和批量操作变得更加容易。

回到顶部