Gradle: Ausführen einer Aktion nur, wenn eine Aufgabe nicht
Möchte ich öffnen Sie die report-Datei, die mehrere der "check" und "test" - plugins, die ich benutze, wenn eine überprüfung fehlschlägt. Ich weiß, ich verwenden können "finalizedBy zum ausführen einer anderen Aufgabe, egal, ob die original-Aufgabe ausgeführt wurde. Mit diesem wissen habe ich versucht, den folgenden zu öffnen Sie den Bericht nur, wenn die entsprechende Aufgabe (in diesem Beispiel checkstyle
) schlägt fehl:
task showCheckStyleResultsInBrowser(type: Exec) {
ext.htmlFileName = "main.html"
executable 'open'
args 'file:///' + checkstyleMain.reports.xml.destination.parent + "/" + ext.htmlFileName
}
task showCheckStyleResultsIfFailed {
ext.aCheckFailed = true
doLast {
if (ext.aCheckFailed) {
showCheckStyleResultsInBrowser.execute()
}
}
}
checkstyleMain {
finalizedBy 'showCheckStyleResultsIfFailed'
doLast {
//convert the xml output to html via https://stackoverflow.com/questions/20361942/generate-checkstyle-html-report-with-gradle
ant.xslt(in: reports.xml.destination,
style: new File('config/checkstyle/checkstyle-noframes-sorted.xsl'),
out: new File(reports.xml.destination.parent, showCheckStyleResultsInBrowser.htmlFileName))
showCheckStyleResultsIfFailed.aCheckFailed = false
}
}
Erklärung (soweit ich es verstehe):
showCheckStyleResultsInBrowser
tritt die Aufgabe, die eigentlich die Eröffnung des Berichts. Sie können ignorieren, was Sie eigentlich tut, aber es ist die eine, die ausgeführt werden soll, wenn der check-Aufgabe schlägt fehl,- Die
showCheckStyleResultsIfFailed
Aufgabe deklariert eine EigenschaftaCheckFailed
und initialisiert es auf true. Wenn es ausgeführt wird, überprüft es, ob es ist immer noch wahr (was bedeutet, dass die Prüfung nicht erfolgreich abgeschlossen wurde) und wenn ja, öffnet sich der Bericht mitshowCheckStyleResultsInBrowser
. checkstyleMain
ist die Aufgabe, die die tatsächliche Prüfung. Ich interessiere mich für das Ergebnis. Allerdings weiß ich nicht, wie man es. Anstatt also, in der Ende descheckStyleMain
Aufgabe, habe ich dieaCheckFailed
Eigenschaftfalse
sich auf die Tatsache, dass der Letzte Schritt wird nur ausgeführt, wenn keine der vorherigen Prüfungen gescheitert.showCheckStyleResultsIfFailed
zur Ausführung nachcheckstyleMain
egal, was vonfinalizedBy
. Auf diese Weise wird es ausgeführt, selbst wenncheckstyleMain
ausfällt. Es verwendet dieaCheckFailed
- Eigenschaft, um zu bestimmen, obcheckstyleMain
erfolgreich abgeschlossen wurde.
Dies funktioniert ok, wenn ich eine komplette bauen. Aber wenn ich nur einen teilweisen Wiederaufbau und die checkstyleMain task wird nicht ausgeführt, da alle Ergebnis sind bereits up-to-date, dass ich am Ende mit aCheckFailed
wahr, weil checkstyleMain
nicht laufen, das macht es Aussehen, als ob tatsächlich etwas falsch gelaufen ist.
Also, wie kann ich Sie ausführen, meine showCheckStyleResultsInBrowser
Aufgabe, wenn, und nur wenn die checkstyleMain Aufgabe scheitert? Auch, meine Lösung ist etwas umständlich und hacky auch für das, was es tut, erreichen. Gibt es einen einfacheren Weg?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie befragen Sie den task-Status, um festzustellen, ob es versagt oder nicht.
Task#execute
ist eine interne Methode, und sollte nicht von Benutzercode aufgerufen. Stattdessen würde ich machenshowCheckStyleResultsIfFailed
anderenExec
Aufgabe. Die zwei Aufgaben, die konfiguriert werden kann, in einem Rutsch, aber es ist wahrscheinlich nicht Wert.showCheckStyleResultsIfFailed
Aufgabe vollständig und fügte hinzu, dieonlyIf
block an den Exec-Open-Aufgabe und machtecheckstyleMain
finalizedBy
showCheckStyleResultsInBrowser
. Auf diese Weise habe ich nur öffentliche API (glaube ich) und die eigentliche exec-task wird nur ausgeführt, wenn etwas fehlgeschlagen ist.TaskStateInternal
das eine innere Klasse. Ich bin sicher, dass die Gradle-team wird nicht entfernen Sie es für eine lange Zeit, weil dieses, aber etwas zu prüfen.