Rust Cargo插件cargo-all-features的使用:一键构建和测试所有Cargo功能的自动化工具

Rust Cargo插件cargo-all-features的使用:一键构建和测试所有Cargo功能的自动化工具

安装

cargo install cargo-all-features

使用

以下命令可以在Cargo包或Cargo工作空间的根目录下运行。

构建所有功能标志组合:

cargo build-all-features <CARGO BUILD FLAGS>

检查所有功能标志组合:

cargo check-all-features <CARGO CHECK FLAGS>

测试所有功能标志组合:

cargo test-all-features <CARGO TEST FLAGS>

为什么需要这个工具?

如果你的crate使用了Rust功能标志,通常会在持续集成工具中设置测试矩阵来单独测试所有功能标志。这种设置可能难以维护,并且容易忘记更新。它也不全面,因为启用功能标志的组合可能导致应该修复的编译错误。这个工具就是为了解决这些问题而构建的。

配置选项

你可以在Cargo.toml文件中添加以下选项来配置cargo-all-features的行为,放在[package.metadata.cargo-all-features]标题下:

[package.metadata.cargo-all-features]

# 功能"foo"和"bar"不兼容,所以跳过包含它们的排列组合
skip_feature_sets = [
    ["foo", "bar"],
]

# 如果你的crate有很多可选依赖项,为了速度可以跳过它们
skip_optional_dependencies = true

# 添加回某些你想要包含在排列组合中的可选依赖项
extra_features = [
    "log",
]

# 从构建矩阵中排除某些功能
denylist = ["foo", "bar"]

# 总是包含这些功能在组合中
always_include_features = ["baz"]

# 一次尝试的最大功能数量。不包括来自`always_include_features`的功能
max_combination_size = 4

# 只在构建矩阵中包含某些功能
allowlist = ["foo", "bar"]

完整示例

假设我们有一个Rust项目,其Cargo.toml定义了多个功能标志:

[features]
default = ["feature_a"]
feature_a = []
feature_b = []
feature_c = []

我们可以使用cargo-all-features来测试所有可能的组合:

# 安装插件
cargo install cargo-all-features

# 切换到项目目录
cd my_project

# 构建所有功能组合
cargo build-all-features

# 测试所有功能组合
cargo test-all-features

# 检查所有功能组合
cargo check-all-features

高级用法

如果你想跳过某些组合或限制组合大小:

[package.metadata.cargo-all-features]
skip_feature_sets = [
    ["feature_a", "feature_b"],  # 跳过同时包含a和b的组合
]
max_combination_size = 2  # 只测试最多2个功能同时启用的情况

完整示例demo

下面是一个更完整的示例,展示如何在真实项目中使用cargo-all-features:

  1. 首先创建一个新项目:
cargo new demo-project
cd demo-project
  1. 编辑Cargo.toml添加多个功能标志:
[features]
default = ["logging"]
logging = ["log"]  # 启用日志功能
network = []       # 网络功能
database = []      # 数据库功能
extra = []         # 额外功能

[dependencies]
log = { version = "0.4", optional = true }  # 可选依赖
  1. 配置cargo-all-features选项:
[package.metadata.cargo-all-features]
skip_feature_sets = [
    ["network", "database"],  # 跳过网络和数据库同时启用的组合
]
max_combination_size = 3      # 最多同时测试3个功能的组合
always_include_features = ["logging"]  # 总是包含日志功能
  1. 运行全面测试:
# 安装插件(如果尚未安装)
cargo install cargo-all-features

# 测试所有功能组合
cargo test-all-features -- --test-threads=1

# 检查所有功能组合
cargo check-all-features

# 构建所有功能组合
cargo build-all-features --release

许可证

该项目采用双重许可证:

  • Apache License, Version 2.0
  • MIT license

你可以选择其中任意一种。


1 回复

Rust Cargo插件cargo-all-features的使用指南

简介

cargo-all-features是一个实用的Cargo插件,用于自动化构建和测试项目中所有可能的特性组合。它解决了手动测试每个特性组合的繁琐问题,特别适合那些拥有多个可选特性的Rust项目。

安装方法

cargo install cargo-all-features

基本使用

构建所有特性组合

# 构建所有可能的特性组合
cargo all-features build

测试所有特性组合

# 测试所有可能的特性组合
cargo all-features test

高级用法

并行执行

# 使用4个并行任务测试所有特性组合
cargo all-features test -j 4

排除特定特性

# 测试时排除feature1和feature2
cargo all-features test --exclude feature1,feature2

仅检查而不实际运行

# 仅检查而不实际运行测试
cargo all-features check

完整示例

项目结构

my_project/
├── Cargo.toml
├── src/
│   ├── lib.rs
│   └── main.rs

Cargo.toml 示例

[package]
name = "my_project"
version = "0.1.0"
edition = "2021"

[features]
default = ["logging"]
logging = []       # 日志功能
compression = []   # 压缩功能
encryption = []    # 加密功能

使用示例

  1. 首先安装插件:
cargo install cargo-all-features
  1. 测试所有特性组合:
# 这将测试8种不同的组合(2^3)
cargo all-features test
  1. 排除特定特性测试:
# 排除logging特性,测试4种组合(2^2)
cargo all-features test --exclude logging
  1. 并行构建:
# 使用4个并行任务构建所有组合
cargo all-features build -j 4

注意事项

  1. 特性组合数量会随着特性数量呈指数增长(2^n种组合)
  2. 对于大型项目,建议使用-j参数进行并行测试
  3. 可以使用--exclude排除已知不需要测试的特性组合
  4. 在CI/CD流程中使用时,可以考虑设置适当的超时时间

替代方案比较

cargo-hack相比,cargo-all-features更专注于特性组合测试,而cargo-hack提供了更广泛的测试场景支持。

回到顶部