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

2024 年 2 月 28 日 · Clippy 团队

自从 Clippy v0.0.97 版本发布,并且在与 rustup 一同分发之前,当你使用 cargo clippy 对代码进行 lint 检查时,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" 的实例,最新的 nightly Clippy 中提供的新的 Clippy lint 规则 clippy::deprecated_clippy_cfg_attr 会发出警告。这个 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" 配置,用户将会在 their feature = "cargo-clippy" 条件上看到大量警告。为了解决这个问题,他们要么需要允许该 lint,要么必须在 Cargo.toml 中添加一个虚设的 feature 来消除这些警告

[features]
cargo-clippy = []

我们认为这不符合用户友好性,因此决定弃用隐式的 feature = "cargo-clippy" 配置,并将其替换为 clippy 配置。