多Rust包项目Clippy配置:生产禁panic,测试允许assert_*
解决方案
1. 对全代码库执行Clippy检查
你的项目属于Rust多包工作区结构,只需完成两步配置,就能用单条命令实现全代码库lint:
步骤1:配置工作区
在根目录的Cargo.toml中添加工作区声明,列出所有子包路径:
[workspace] members = [ ".", # 根目录的Rust库 "ffi", # ffi下的C库 "ffi/common", "ffi/python", "ffi/ruby", ]
步骤2:执行全量lint命令
运行以下命令,即可覆盖所有包的生产代码、测试代码、示例等所有目标:
cargo clippy --all-targets --all-features
--all-targets:包含所有构建目标(库、二进制、测试、示例等)--all-features:启用所有包的特性开关(若无需全特性,可移除该参数)
如果想简化命令,可在根Cargo.toml中添加别名:
[alias] lint = "clippy --all-targets --all-features"
之后只需运行cargo lint即可完成全量检查。
2. 区分生产/测试代码的panic相关规则
要实现生产代码禁用panic、测试代码允许assert_*宏,无需在代码中添加Clippy属性,只需在根目录集中配置规则:
方式1:通过根Cargo.toml配置
在根目录的Cargo.toml中添加工作区级别的Clippy配置,所有子包会自动继承:
[workspace.clippy] # 生产代码禁用所有panic相关行为 deny = [ "panic", "unwrap_used", "expect_used", "panic_in_result_fn", ] # 测试代码允许这些规则 [workspace.clippy.'cfg(test)'] allow = [ "panic", "unwrap_used", "expect_used", "panic_in_result_fn", ]
方式2:通过根clippy.toml配置
若偏好独立的lint配置文件,在根目录创建clippy.toml,内容如下:
# 生产代码规则 panic = "deny" unwrap_used = "deny" expect_used = "deny" panic_in_result_fn = "deny" # 测试代码专属规则 [cfg(test)] panic = "allow" unwrap_used = "allow" expect_used = "allow" panic_in_result_fn = "allow"
说明
assert_*宏本质会触发panic,允许panic规则后,测试代码中的assert_eq!、assert!等宏不会被Clippy报错- 上述规则覆盖了常见的panic触发场景:直接调用
panic!、使用unwrap/expect、在返回Result的函数中panic
验证
运行cargo clippy --all-targets后:
- 生产代码中出现
panic!、unwrap()等行为会被Clippy拒绝 - 测试代码中的
assert_*宏及测试专属的unwrap/expect操作会被允许
内容的提问来源于stack exchange,提问作者csmathhc
相关产品推荐
相关产品推荐

