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.