2017-01-05 1 views
3

In einem Projekt Cargo, kann ich leicht clippy auf meinem src Code diesen Befehl ausführen:Gibt es eine einfachere Möglichkeit, clippy auf meinem Build-Skript auszuführen?

rustup run nightly cargo clippy 

Allerdings, wenn ich ein build script bin mit, würde Ich mag auch clippy darauf laufen. Zum Beispiel sieht, wenn meine build.rs-Datei wie folgt:

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

Ich möchte, dies sehen, wenn ich clippy laufen:

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 

Die einzige Möglichkeit, die ich denken kann clippy auf meinem Build laufen Skript ist es in ein cargo new temporäres Projekt, führen clippy zu kopieren, meine dort Änderungen vorzunehmen, und kopieren sie zurück, aber das ist schrecklich unbequem und wird schnell undurchführbar, wenn build dependencies und dergleichen zur Mischung hinzugefügt.

Gibt es einen einfacheren Weg, um meinen Build-Skript mit clippy zu analysieren?

+0

@Shempmaster Ich entschied mich, "clippy" anstelle von "Clippy" zu schreiben, weil die einzige Instanz von "Clippy" mit einem Großbuchstaben "C" in [README] (https://raw.githubusercontent.com/Manishearth/rust -clippy/master/README.md) befindet sich in einer Titel-Fall-Bildbeschreibung. –

Antwort

3

Es gibt zwei Möglichkeiten, Clippy zu verwenden: den cargo clippy Befehl und das clippy Compiler-Plugin. cargo clippy erkennt den Build-Skript als eine Abhängigkeit des Hauptprojektes, so dass es nicht die Compiler-Plugin laden.

Daher ist die andere Option ist der Compiler direkt Plugin zu verwenden. Die Anweisungen dazu finden Sie in clippy's README. Wir müssen jedoch einige Anpassungen vornehmen, um es im Build-Skript zu verwenden.

Zuerst müssen wir clippy als Build-Abhängigkeit hinzuzufügen:

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

[features] 
default = [] 

es [dependencies] statt Hinzufügen wird nicht funktionieren (das Ergebnis ist error[E0463]: can't find crate for `clippy`), als Cargo wird den Weg nicht zu Abhängigkeiten zu den Compiler übergeben beim Erstellen des Build-Skripts.

Dann müssen wir das an der Spitze der build.rs hinzuzufügen:

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

Schließlich müssen wir mit dem clippy Funktion bauen aktiviert:

$ cargo build --features clippy 

Wenn Sie clippy ausführen möchten auf sowohl der Build-Skript und auf dem Hauptprojekt, wenn Sie den Befehl oben verwenden, fügen Sie die gleiche clippy Abhängigkeit zu [dependencies], fügen Sie dann die cfg_attr Attribute an die Kiste Wurzel (n) (012., main.rs, usw.).

+0

Danke! Es scheint, dass das Problem bei diesem Ansatz (außer mit 'Cargo.toml',' build.rs' mit Anmerkungen versehen und 'lib.rs' oder' main.rs') ist, dass clippy nur ausgeführt wird, wenn die Datei analysiert werden soll neu kompiliert, wobei 'cargo clippy' immer klippig läuft, auch wenn die Datei nicht neu kompiliert werden muss. Gibt es einen besseren Weg, dieses Verhalten zu erreichen, als einfach "build.rs" zu bearbeiten, bevor "cargo build" ausgeführt wird? –

+0

Sie können 'cargo clean --package ' vorher ausführen; Dadurch werden sowohl das Projekt selbst als auch das Build-Skript bereinigt. –

+0

Das scheint nicht zu funktionieren; Wenn ich diesen Befehl ausführe und dann 'rustup run nightly cargo build - features clippy' wieder starte, bekomme ich die clippy Ausgabe für meinen' src' Code, aber nicht meine 'build.rs' Datei. –

Verwandte Themen