1 个不稳定版本
0.1.0 | 2018年11月3日 |
---|
#13 in #mistakes
2KB
Clippy
一组用于捕获常见错误并改进你的 Rust 代码的代码风格检查。
代码风格检查分为类别,每个类别都有一个默认的 代码风格检查级别。你可以通过按类别更改代码风格检查级别来选择Clippy应该多“打扰”你多少,或者说帮助你的程度。
类别 | 描述 | 默认级别 |
---|---|---|
clippy::all |
默认开启的所有代码风格检查(正确性、可疑、风格、复杂度、性能) | warn/deny |
clippy::correctness |
明显错误或无用的代码 | deny |
clippy::suspicious |
最可能错误或无用的代码 | warn |
clippy::style |
应该以更惯用方式编写的代码 | warn |
clippy::complexity |
以复杂方式完成简单任务的代码 | warn |
clippy::perf |
可以编写以运行更快的代码 | warn |
clippy::pedantic |
相当严格或偶尔有误报的代码风格检查 | allow |
clippy::restriction |
防止使用语言和库功能的代码风格检查[^restrict] | allow |
clippy::nursery |
仍在开发中的新代码风格检查 | allow |
clippy::cargo |
cargo清单的代码风格检查 | allow |
更多内容即将到来,如果您有想法,请 提交一个问题!
restriction
类别不应该整体启用。包含的代码风格检查可能对完全合理的代码进行检查,可能没有替代建议,并且可能与任何其他代码风格检查(包括其他类别)冲突。在启用之前,应针对每个案例进行考虑。
一些用于 restriction
规则的用例包括:- 严格的编码风格(例如 clippy::else_if_without_else
)。- 在 CI 中增加额外的限制(例如 clippy::todo
)。- 防止某些函数中的 panic(例如 clippy::unwrap_used
)。- 只在代码子集上运行规则(例如在一个模块中使用 #[forbid(clippy::float_arithmetic)]
)。
目录
用法
以下是如何将 Clippy 作为 cargo 子命令使用,在未使用 cargo 的项目中,或在 Travis CI 中的说明。
作为 cargo 子命令 (cargo clippy
)
使用 Clippy 的一种方法是通过 rustup 安装 Clippy 作为 cargo 子命令。
步骤 1:安装 Rustup
您可以在支持的平台上安装 Rustup。这将帮助我们安装 Clippy 和其依赖项。
如果您已经安装了 Rustup,请更新以确保您拥有最新的 Rustup 和编译器
rustup update
步骤 2:安装 Clippy
一旦您安装了 rustup 和最新的稳定版本(至少 Rust 1.29),运行以下命令
rustup component add clippy
如果它说找不到 clippy
组件,请运行 rustup self update
。
步骤 3:运行 Clippy
现在您可以运行 Clippy,通过执行以下命令
cargo clippy
自动应用 Clippy 建议
Clippy 可以像编译器一样自动应用一些规则建议。请注意,--fix
意味着 --all-targets
,因此它可以修复尽可能多的代码。
cargo clippy --fix
工作区
Clippy 应该与所有常规工作区选项一起工作。例如,以下命令将在 example
包上运行 Clippy
cargo clippy -p example
与 cargo check
一样,这包括工作区成员的依赖项,如路径依赖项。如果您只想在给定的包上运行 Clippy,请使用 --no-deps
选项,如下所示
cargo clippy -p example -- --no-deps
使用 clippy-driver
Clippy 也可以用于不使用 cargo 的项目。要做到这一点,请使用与 rustc
相同的参数运行 clippy-driver
。例如
clippy-driver --edition 2018 -Cpanic=abort foo.rs
请注意,clippy-driver
是专门用于运行 Clippy 的,不应作为 rustc
的一般替代品。例如,clippy-driver
可能会产生不符合预期的未优化工件。
Travis CI
您可以通过与本地使用相同的方式将 Clippy 添加到 Travis CI。
language: rust
rust:
- stable
- beta
before_script:
- rustup component add clippy
script:
- cargo clippy
# if you want the build job to fail when encountering warnings, use
- cargo clippy -- -D warnings
# in order to also check tests and non-default crate features, use
- cargo clippy --all-targets --all-features -- -D warnings
- cargo test
# etc.
请注意,添加 -D 警告
会导致构建失败,如果代码中存在任何警告。这包括由 rustc 找到的警告(例如 dead_code
等)。如果您想避免这种情况,并且只想在 Clippy 警告时引发错误,请使用代码中的 #![deny(clippy::all)]
或命令行上的 -D clippy::all
。您可以将 clippy::all
与您要针对的具体 lint 类别进行交换。
配置
允许/拒绝 lint
您可以在代码中添加选项来 allow
/warn
/deny
Clippy lint
-
使用
clippy
lint 组(#![deny(clippy::all)]
)拒绝整个Warn
lint 集合。请注意,rustc
有额外的 lint 组。 -
使用
clippy
和clippy::pedantic
lint 组(#![deny(clippy::all)]
,#![deny(clippy::pedantic)]
)拒绝所有 lint。请注意,clippy::pedantic
包含一些非常激进的 lint,容易出现误报。 -
仅拒绝一些 lint(例如
#![deny(clippy::single_match, clippy::box_vec)]
等) -
使用
#[allow(...)]
等等,可以将allow
/warn
/deny
限制在单个函数或模块中。
注意:allow
表示抑制代码中的 lint。使用 warn
时,lint 将只发出警告,而使用 deny
时,lint 将在触发代码时发出错误。错误会导致 Clippy 以错误代码退出,因此它在 CI/CD 等脚本中很有用。
如果您不想在代码中包含 lint 级别,您可以在运行 Clippy 时通过传递额外的标志全局启用/禁用 lint。
要允许 lint_name
,运行
cargo clippy -- -A clippy::lint_name
要警告 lint_name
,运行
cargo clippy -- -W clippy::lint_name
这也适用于 lint 组。例如,您可以使用所有 lint 启用警告运行 Clippy。
cargo clippy -- -W clippy::pedantic
如果您只关心单个代码风格问题,您可以允许所有其他问题,然后明确警告您感兴趣的问题。
cargo clippy -- -A clippy::all -W clippy::useless_format -W clippy::...
配置某些代码风格问题的行为
一些代码风格问题可以在名为 clippy.toml
或 .clippy.toml
的 TOML 文件中配置。它包含基本的 变量 = 值
映射,例如。
avoid-breaking-exported-api = false
disallowed-names = ["toto", "tata", "titi"]
配置表 包含所有配置值、它们的默认值以及它们影响的代码风格问题列表。每个 可配置的代码风格问题 也包含有关这些值的信息。
对于具有默认值的列表类型配置,例如 不允许的名称,您可以使用唯一值 ".."
来扩展默认值,而不是替换它们。
# default of disallowed-names is ["foo", "baz", "quux"]
disallowed-names = ["bar", ".."] # -> ["bar", "foo", "baz", "quux"]
注意
clippy.toml
或.clippy.toml
不能用于允许或拒绝代码风格问题。
要禁用“有关更多信息请访问 lint-link”的消息,您可以定义 CLIPPY_DISABLE_DOCS_LINKS
环境变量。
指定最低支持的 Rust 版本
打算支持旧版 Rust 的项目可以通过在 Clippy 配置文件中指定最低支持的 Rust 版本(MSRV)来禁用与新特性相关的代码风格问题。
msrv = "1.30.0"
或者,可以使用 Cargo.toml
中的 rust-version
字段。
# Cargo.toml
rust-version = "1.30"
MSRV 也可以作为属性指定,如下所示。
#![feature(custom_inner_attributes)]
#![clippy::msrv = "1.30.0"]
fn main() {
...
}
在指定 MSRV 时,您也可以省略补丁版本,因此 msrv = 1.30
等同于 msrv = 1.30.0
。
注意:custom_inner_attributes
是一个不稳定的功能,因此必须显式启用。
识别此配置选项的代码风格问题可以在 这里 找到
贡献
如果您想为 Clippy 贡献,可以在 CONTRIBUTING.md 中找到更多信息。
许可协议
版权 2014-2024 Rust 项目开发者
根据您的选择,受 Apache License 2.0 <LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0> 或 MIT 许可证 <LICENSE-MIT 或 https://opensource.org/licenses/MIT> 的许可。项目中的文件不得复制、修改或分发,除非根据那些条款。