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 ?

Stefan Kendall
quelle

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

Rene Groeschke
quelle
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 .

cmcginty
quelle
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.

c_maker
quelle
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 }
    }
  }
}
Matthias Braun
quelle