Rust构建系统优化插件rustc-workspace-hack的使用,加速Cargo多crate工作空间编译效率

Rust构建系统优化插件rustc-workspace-hack的使用,加速Cargo多crate工作空间编译效率

安装方法

在你的项目目录中运行以下Cargo命令:

cargo add rustc-workspace-hack

或者在你的Cargo.toml中添加以下行:

rustc-workspace-hack = "1.0.0"

完整示例代码

示例1:工作空间配置

// 工作空间根目录下的Cargo.toml
[workspace]
members = [
    "crate1",
    "crate2",
    "rustc-workspace-hack"  // 必须包含hack crate作为成员
]

示例2:hack crate配置

// rustc-workspace-hack crate的Cargo.toml
[package]
name = "rustc-workspace-hack"
version = "1.0.0"
edition = "2021"

[dependencies]
# 这里添加你工作空间所有crate共有的依赖项
syn = "1.0"          // 过程宏常用的语法解析库
quote = "1.0"        // 代码生成工具
proc-macro2 = "1.0"  // 过程宏支持库

示例3:普通crate配置

// 其他crate的Cargo.toml示例
[package]
name = "crate1"
version = "0.1.0"
edition = "2021"

[dependencies]
rustc-workspace-hack = { path = "../rustc-workspace-hack" }  // 引用共享依赖
# 其他特定依赖
serde = "1.0"  // 仅这个crate需要的特定依赖

工作原理

rustc-workspace-hack通过创建一个共享依赖的crate来优化Rust工作空间的编译效率:

  1. 将所有crate共有的依赖项集中到一个专用crate中
  2. 其他crate通过path依赖引用这个共享crate
  3. Cargo会重用共享依赖的编译结果,减少重复编译

使用建议

  1. 将rustc-workspace-hack作为工作空间的一个成员
  2. 将所有公共依赖放入rustc-workspace-hack的Cargo.toml
  3. 其他crate通过path依赖引用rustc-workspace-hack
  4. 对于大型工作空间,这种优化可以显著减少编译时间

注意:此技术特别适用于包含多个crate且共享大量依赖项的工作空间项目。


1 回复

以下是基于提供内容的完整示例demo:

示例项目结构

my-workspace/
├── Cargo.toml
├── crate1/
│   ├── Cargo.toml
│   └── src/
├── crate2/
│   ├── Cargo.toml
│   └── src/
└── hack/
    ├── Cargo.toml
    └── src/

完整示例代码

  1. 工作空间根目录 Cargo.toml:
[workspace]
members = ["crate1", "crate2", "hack"]

[dev-dependencies]
rustc-workspace-hack = "1.0"
  1. hack/Cargo.toml:
[package]
name = "rustc-workspace-hack"
version = "0.1.0"
edition = "2021"

# 工作空间共享的公共依赖
[dependencies]
serde = { version = "1.0", features = ["derive"] }  # 带derive特性的serde
tokio = { version = "1.0", features = ["full"] }    # 全功能tokio
anyhow = "1.0"                                     # 错误处理库
  1. crate1/Cargo.toml:
[package]
name = "crate1"
version = "0.1.0"
edition = "2021"

# 引用工作空间hack中的公共依赖
[dependencies]
rustc-workspace-hack = { path = "../hack" }
# crate1特有的依赖
reqwest = "0.11"
  1. crate2/Cargo.toml:
[package]
name = "crate2"
version = "0.1.0"
edition = "2021"

# 引用工作空间hack中的公共依赖
[dependencies]
rustc-workspace-hack = { path = "../hack" }
# crate2特有的依赖
clap = { version = "3.0", features = ["derive"] }
  1. hack/src/lib.rs (可选):
// 可以在此重新导出常用类型
pub use serde::{Serialize, Deserialize};
pub use tokio::spawn;
pub use anyhow::{Result, Error};

使用说明

  1. 初始化项目结构:
mkdir -p my-workspace/{crate1,crate2,hack}/src
  1. 创建上述配置文件

  2. 构建项目:

cd my-workspace
cargo build

效果验证

构建完成后,可以运行以下命令观察构建时间差异:

# 首次构建
time cargo build

# 修改crate1后重新构建
touch crate1/src/lib.rs
time cargo build

注意:实际时间节省效果取决于项目规模和依赖复杂度。对于大型项目(10+个crate),通常能观察到20-50%的构建时间减少。

回到顶部