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

时间:2017-01-05 03:49:40

标签: rust static-analysis rust-cargo

在Cargo项目中,我可以使用此命令轻松地在src代码上运行clippy

rustup run nightly cargo clippy

但是,如果我使用的是build script,我也希望能够使用build dependencies。例如,如果我的build.rs文件如下所示:

fn main() {
    let foo = "Hello, world!";
    println!("{}", foo);
}

当我运行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

我能想到在我的构建脚本上运行clippy的唯一方法是将其复制到cargo new临时项目中,运行clippy,在那里进行更改,然后复制回来,但这非常不方便且很快当{{3}}等添加到混合物中时变得不可行。

使用clippy分析我的构建脚本是否有更简单的方法?

1 个答案:

答案 0 :(得分:4)

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

因此,另一个选择是直接使用编译器插件。执行此操作的说明位于clippy's README。但是,我们需要对构建脚本中的它进行一些调整。

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

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

[features]
default = []

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

然后,我们需要在build.rs的顶部添加:

#![cfg_attr(feature="clippy", feature(plugin))]
#![cfg_attr(feature="clippy", plugin(clippy))]

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

$ cargo build --features clippy

如果要在使用上述命令时在构建脚本和主项目上运行clippy,请将相同的clippy依赖项添加到[dependencies],然后添加{ {1}} crate根(cfg_attrlib.rs等)的属性。