配置 Clippy

注意: 配置文件不稳定,将来可能会被弃用。

一些 lint 可以在名为 clippy.toml.clippy.toml 的 TOML 文件中配置,该文件会在以下位置搜索:

  1. CLIPPY_CONF_DIR 环境变量指定的目录,或者
  2. CARGO_MANIFEST_DIR 环境变量指定的目录,或者
  3. 当前目录。

它包含一个基本的 variable = value 映射,例如:

avoid-breaking-exported-api = false
disallowed-names = ["toto", "tata", "titi"]

配置表包含了所有配置值、它们的默认值以及它们影响的 lint 列表。每个 可配置的 lint 也包含有关这些值的信息。

对于具有默认值的列表类型的配置,例如 disallowed-names,您可以使用唯一值 ".." 来扩展默认值,而不是替换它们。

# default of disallowed-names is ["foo", "baz", "quux"]
disallowed-names = ["bar", ".."] # -> ["bar", "foo", "baz", "quux"]

要禁用“有关更多信息,请访问lint-link”消息,您可以定义 CLIPPY_DISABLE_DOCS_LINKS 环境变量。

允许/拒绝 Lint

代码中的属性

您可以在代码中添加属性来 allow/warn/deny Clippy lint

  • 使用 clippy lint 组禁用所有默认 warn 的 lint (#![allow(clippy::all)])

  • 使用 clippyclippy::pedantic lint 组禁用所有 lint (#![warn(clippy::all, clippy::pedantic)])。请注意,clippy::pedantic 包含一些非常激进的 lint,容易产生误报。

  • 仅禁用一些 lint (#![deny(clippy::single_match, clippy::box_vec)] 等)

  • allow/warn/deny 可以使用 #[allow(...)] 等限制为单个函数或模块。

注意: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 组。例如,您可以运行 Clippy 并启用所有 pedantic lint 的警告

cargo clippy -- -W clippy::pedantic

如果您只关心某些 lint,您可以允许所有其他 lint,然后显式警告您感兴趣的 lint

cargo clippy -- -A clippy::all -W clippy::useless_format -W clippy::...

Cargo.toml 中的 Lints 部分

最后,可以使用 Cargo.toml 文件中 lints 部分允许/拒绝 lint

要拒绝 clippy::enum_glob_use,请在 Cargo.toml 中放入以下内容

[lints.clippy]
enum_glob_use = "deny"

有关更多详细信息和选项,请参阅 Cargo 文档。

指定支持的最低 Rust 版本

打算支持旧版本 Rust 的项目可以通过在 Clippy 配置文件中指定支持的最低 Rust 版本 (MSRV) 来禁用与较新功能相关的 lint。

msrv = "1.30.0"

MSRV 也可以指定为属性,如下所示。

#![feature(custom_inner_attributes)]
#![clippy::msrv = "1.30.0"]

fn main() {
    ...
}

您还可以在指定 MSRV 时省略补丁版本,因此 msrv = 1.30 等效于 msrv = 1.30.0

注意:custom_inner_attributes 是一个不稳定的功能,因此必须显式启用它。

可以识别此配置选项的 lint 可在此处找到

禁用某些代码的评估

注意: 这应该仅在其他解决方案(例如 #[allow(clippy::all)])不足时使用。

极少数情况下,您可能希望阻止 Clippy 完全评估代码的某些部分。您可以使用条件编译通过检查是否未设置 clippy cfg 来执行此操作。您可能需要提供一个存根,以便代码可以编译

#![allow(unused)]
fn main() {
#[cfg(not(clippy))]
include!(concat!(env!("OUT_DIR"), "/my_big_function-generated.rs"));

#[cfg(clippy)]
fn my_big_function(_input: &str) -> Option<MyStruct> {
    None
}
}