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:
- 首先创建一个新项目:
cargo new demo-project
cd demo-project
- 编辑Cargo.toml添加多个功能标志:
[features]
default = ["logging"]
logging = ["log"] # 启用日志功能
network = [] # 网络功能
database = [] # 数据库功能
extra = [] # 额外功能
[dependencies]
log = { version = "0.4", optional = true } # 可选依赖
- 配置cargo-all-features选项:
[package.metadata.cargo-all-features]
skip_feature_sets = [
["network", "database"], # 跳过网络和数据库同时启用的组合
]
max_combination_size = 3 # 最多同时测试3个功能的组合
always_include_features = ["logging"] # 总是包含日志功能
- 运行全面测试:
# 安装插件(如果尚未安装)
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 = [] # 加密功能
使用示例
- 首先安装插件:
cargo install cargo-all-features
- 测试所有特性组合:
# 这将测试8种不同的组合(2^3)
cargo all-features test
- 排除特定特性测试:
# 排除logging特性,测试4种组合(2^2)
cargo all-features test --exclude logging
- 并行构建:
# 使用4个并行任务构建所有组合
cargo all-features build -j 4
注意事项
- 特性组合数量会随着特性数量呈指数增长(2^n种组合)
- 对于大型项目,建议使用
-j
参数进行并行测试 - 可以使用
--exclude
排除已知不需要测试的特性组合 - 在CI/CD流程中使用时,可以考虑设置适当的超时时间
替代方案比较
与cargo-hack
相比,cargo-all-features
更专注于特性组合测试,而cargo-hack
提供了更广泛的测试场景支持。