Zurücksetzen der UP-TO-DATE-Eigenschaft von Gradle-Aufgaben?


106

Gibt es eine Möglichkeit, eine Gradle-Aufgabe erneut auszuführen oder alle Aufgaben auf den Status "NICHT AKTUELL" zurückzusetzen ?

Antworten:


132

Versuchen Sie, Ihren Build so auszuführen, -C rebuilddass Gradles Cache neu erstellt wird.

Verwenden Sie in neueren Versionen von Gradle --rerun-tasks


89

Wenn immer nur eine einzelne Aufgabe ausgeführt werden soll, können Sie die outputsEigenschaft innerhalb der Aufgabe festlegen .

outputs.upToDateWhen { false }

Bitte beachten Sie, dass Gradle die Aufgabe möglicherweise überspringt, wenn für Ihre Aufgabe keine Dateieingaben definiert sind, auch wenn der obige Code verwendet wird. Beispielsweise muss in einer Zip- oder Kopieraufgabe mindestens eine Datei in der Konfigurationsphase der Aufgabendefinition bereitgestellt werden .


14
Das tut nichts für mich. Ich habe es einer Aufgabe hinzugefügt und bekomme "UP-TO-DATE". Das Lustige ist, dass es sich um eine ZipTask handelt und ich das Zielarchiv gelöscht habe.
— Maaartinus

5
Dies ist unglaublich für die Verwendung wie tasks.whenTaskAdded { theTask -> if (theTask.name.startsWith("dex")) { theTask.outputs.upToDateWhen { false } theTask.doLast { task ->... }}}
— Martin L.

Aktualisierte Antwort für den Fall, dass die Aufgabe nicht ausgeführt wird.
— cmcginty

Beachten Sie, dass heutzutage, wenn der von Gradle erstellte Cache aktiviert ist, die Aufgabe nicht erneut ausgeführt wird, sondern nur die Ausgabe aus dem Cache wiederhergestellt wird.
— Stephen Friedrich

25

Sie können verwenden cleanTaskname

Nehmen wir an, Sie haben

:someproject:sometask1 UP-TO-DATE
:someproject:sometask2 UP-TO-DATE
:someproject:sometask3 UP-TO-DATE

Und Sie möchten erzwingen, dass sometask2 erneut ausgeführt wird

someproject:cleanSometask2

bevor Sie die Aufgabe ausführen, die alles ausführt.

Anscheinend versteht jede Aufgabe, die UP-TO-DATE versteht, auch, wie man sich selbst reinigt.


1
'gradle clean' bereinigt alles für das Projekt, in dem Sie sich befinden. Grundsätzlich wird Ihr Hauptausgabeordner gelöscht, der standardmäßig '/ build' lautet. Ist es das, wonach du gesucht hast?
— c_maker

6
Nein. Das wird nicht neu eingestellt, wenn die Aktualität als keine Ausgabedateien für eine bestimmte Aufgabe erfasst wurde. Das heißt, wenn ich einen Teil der Build-Unterbrechung hatte, aber insgesamt erfolgreich war, ist der erfasste Status falsch und ich muss ihn löschen.
— Stefan Kendall

1
Normalerweise ist die 'saubere' Aufgabe, die alles in $ buildDir löscht, in Build-Skripten verfügbar, wie sie vom Basis-Plugin eingeführt wird.
— Rene Groeschke

5

Ich hatte einen schwierigen Fall, in dem das Setzen outputs.upToDateWhen { false }innerhalb der Aufgabe oder das Hinzufügen des Flags --rerun-tasksnicht geholfen hat, da die Aufgabe jedes Mal, wenn ich sie ausführte setOnlyIf, auf gesetzt wurde false.

Fügen Sie Folgendes hinzu, um build.gradledie Ausführung von zu erzwingen myTask:

gradle.taskGraph.whenReady { taskGraph ->
  def tasks = taskGraph.getAllTasks()
  tasks.each {
    def taskName = it.getName()
    if(taskName == 'myTask') {
      println("Found $taskName")

      it.setOnlyIf { true }
      it.outputs.upToDateWhen { false }
    }
  }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.