Clippy:弃用 `feature = "cargo-clippy"`

2024 年 2 月 28 日 · Clippy 团队

自从 Clippy v0.0.97 及其之前版本随 rustup 一起发布以来,Clippy 在使用 cargo clippy 进行代码检查时,会隐式添加一个 feature = "cargo-clippy" 配置1

在过去(2016 年),这对于使用属性来允许、警告或拒绝 Clippy lint 是必要的。

#[cfg_attr(feature = "cargo-clippy", allow(clippy_lint_name))]

这样做很久以来已经不再必要了。现在,Clippy 用户将使用带有 clippy:: 前缀的工具 lint 属性来设置 lint 级别。

#[allow(clippy::lint_name)]

隐式的 feature = "cargo-clippy" 仅为了向后兼容而保留,但在即将到来的 nightly 版本和稍后的 1.78.0 版本中将被弃用。

替代方案

由于存在根据 Clippy 进行条件编译的罕见 用例,我们将提供一个替代方案。因此,在未来(1.78.0)你将能够使用

#[cfg(clippy)]

过渡

如果你只使用 stable 工具链,你可以等待 Rust 1.78.0 (2024-05-02) 发布后再进行过渡。

如果你的代码库中存在 feature = "cargo-clippy" 的实例,你将看到来自新的 Clippy lint clippy::deprecated_clippy_cfg_attr 的警告,该 lint 在最新的 nightly Clippy 中可用。这个 lint 可以自动修复你的代码。因此,如果你看到这个 lint 触发,只需运行

cargo clippy --fix -- -Aclippy::all -Wclippy::deprecated_clippy_cfg_attr

这将修复你代码中的所有实例。

此外,检查你的 .cargo/config 文件中是否有

[target.'cfg(feature = "cargo-clippy")']
rustflags = ["-Aclippy::..."]

如果你有此配置,你必须自己更新它,方法是将其更改为 cfg(clippy),或者借此机会过渡到直接在 Cargo.toml 中设置 lint 级别

弃用动机

目前,有一个 征求测试,以便稳定 在编译时检查条件编译,即 cargo check -Zcheck-cfg。如果我们保留 feature = "cargo-clippy" 配置,用户将在他们的 feature = "cargo-clippy" 条件上看到很多警告。为了解决这个问题,他们要么需要允许该 lint,要么必须在他们的 Cargo.toml 中添加一个虚拟功能来消除这些警告。

[features]
cargo-clippy = []

我们认为这对于用户不友好,并决定改为弃用隐式的 feature = "cargo-clippy" 配置,并将其替换为 clippy 配置。

  1. 你可能甚至不知道 Clippy 隐式设置了这个配置(这不是 Cargo 的功能)。这是有意的,因为我们很久以前就停止宣传和记录这一点了。