In a Cargo project, I can easily run clippy on my src
code using this command:
rustup run nightly cargo clippy
However, if I'm using a build script, I'd like to run clippy on that as well. For instance, if my build.rs
file looks like this:
fn main() {
let foo = "Hello, world!";
println!("{}", foo);
}
I'd like to see this when I run 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
The only way I can think of to run clippy on my build script is to copy it into a cargo new
temporary project, run clippy, make my changes there, and copy back, but this is horribly inconvenient and quickly becomes infeasible when build dependencies and the like are added to the mix.
Is there a simpler way to analyze my build script with clippy?
Note: This solution no longer works. The clippy plugin feature has been removed (source).
There are two ways to use Clippy: the
cargo clippy
command and theclippy
compiler plugin.cargo clippy
detects the build script as a dependency of the main project, so it doesn't load the compiler plugin.Therefore, the other option is to use the compiler plugin directly. The instructions for doing this are in clippy's README. We need to make a few adaptations for using it on the build script, though.
First, we need to add
clippy
as a build dependency:Adding it to
[dependencies]
instead will not work (the result iserror[E0463]: can't find crate for `clippy`
), as Cargo will not pass the path to dependencies to the compiler when building the build script.Then, we need to add this at the top of
build.rs
:Finally, we need to build with the
clippy
feature enabled:If you want to run
clippy
on both the build script and on the main project when you use the command above, add the sameclippy
dependency to[dependencies]
, then add thecfg_attr
attributes to the crate root(s) (lib.rs
,main.rs
, etc.).