有没有在我的构建脚本上运行clippy的简单方法?

Sam*_*tep 5 static-analysis rust rust-cargo

在Cargo项目中,我可以使用以下命令在代码上轻松运行clippysrc

rustup run nightly cargo clippy
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用的是构建脚本,我也想在其上运行clippy。例如,如果我的build.rs文件如下所示:

fn main() {
    let foo = "Hello, world!";
    println!("{}", foo);
}
Run Code Online (Sandbox Code Playgroud)

运行clippy时,我希望看到以下内容:

warning: use of a blacklisted/placeholder name `foo`, #[warn(blacklisted_name)] on by default
 --> build.rs:2:9
  |
2 |     let foo = "Hello, world!";
  |         ^^^
  |
  = help: for further information visit https://github.com/Manishearth/rust-clippy/wiki#blacklisted_name
Run Code Online (Sandbox Code Playgroud)

我能想到的在构建脚本上运行clippy的唯一方法是将其复制到一个cargo new临时项目中,运行clippy,在此处进行更改,然后再复制回去,但这非常不方便,并且在构建依赖项等时很快变得不可行被添加到混合。

有没有一种简单的方法可以用clippy分析我的构建脚本?

Fra*_*gné 5

有两种使用Clippy的方式:cargo clippy命令和clippy编译器插件。cargo clippy将构建脚本检测为主要项目的依赖项,因此它不会加载编译器插件。

因此,另一个选择是直接使用编译器插件。clippy的README中提供了执行此操作的说明。但是,我们需要对在构建脚本上使用它进行一些修改。

首先,我们需要添加clippy作为构建依赖项:

[build-dependencies]
clippy = { version = "*", optional = true }

[features]
default = []
Run Code Online (Sandbox Code Playgroud)

[dependencies]相反,将其添加到将不起作用(结果为error[E0463]: can't find crate for `clippy`),因为在构建构建脚本时,Cargo不会将依赖关系的路径传递给编译器。

然后,我们需要将其添加到build.rs

#![cfg_attr(feature="clippy", feature(plugin))]
#![cfg_attr(feature="clippy", plugin(clippy))]
Run Code Online (Sandbox Code Playgroud)

最后,我们需要在clippy启用功能的情况下进行构建:

$ cargo build --features clippy
Run Code Online (Sandbox Code Playgroud)

如果你想运行clippy在使用上面的命令上都构建脚本和主体工程,添加相同的clippy依赖关系[dependencies],然后添加cfg_attr属性箱子根(S)( ,lib.rsmain.rs等)。