自从 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
配置。
-
你可能甚至不知道 Clippy 隐式设置了这个配置(这不是 Cargo 的功能)。这是有意的,因为我们很久以前就停止宣传和记录这一点了。↩