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

2024 年 2 月 28 日 · Clippy 团队

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

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

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

这样做已经很久没有必要了。如今,Clippy 用户会使用工具 lint 属性(使用 clippy:: 前缀)来设置 lint 级别。

#[allow(clippy::lint_name)]

隐式的 feature = "cargo-clippy" 一直保留是为了向后兼容,但将在即将发布的 nightly 版本中被弃用,并在 1.78.0 版本中正式弃用。

替代方案

由于存在一个罕见的 用例,它依赖于 Clippy 进行条件编译,因此我们将提供一个替代方案。因此,在未来(1.78.0)版本中,您可以使用

#[cfg(clippy)]

迁移

如果您只使用稳定版工具链,您可以等到 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 功能)。这是故意的,因为我们很久以前就停止宣传和记录它了。