Resetowanie właściwości UP-TO-DATE zadań gradle?

106

Czy istnieje sposób, aby wymusić ponowne uruchomienie zadania oceny lub zresetować wszystkie zadania do stanu, w którym nie są aktualne ?

Stefan Kendall
źródło

Odpowiedzi:

133

Spróbuj uruchomić kompilację z -C rebuildtym, że odbudowuje pamięć podręczną Gradle'a.

W nowszych wersjach Gradle użyj --rerun-tasks

Rene Groeschke
źródło
89

Jeśli chcesz, aby zawsze było uruchamiane tylko jedno zadanie, możesz ustawić outputswłaściwość wewnątrz zadania.

outputs.upToDateWhen { false }

Należy pamiętać, że jeśli twoje zadanie nie ma żadnych zdefiniowanych plików wejściowych, Gradle może je pominąć, nawet przy użyciu powyższego kodu. Na przykład w zadaniu Zip lub Copy musi istnieć co najmniej jeden plik dostarczony w fazie konfiguracji definicji zadania.

cmcginty
źródło
14
To nic dla mnie nie robi. Dodałem to do zadania i otrzymałem „AKTUALNOŚCI”. Zabawne jest to, że jest to ZipTask i usunąłem archiwum docelowe.
maaartinus
5
Jest to niewiarygodne w przypadku takiego użycia:tasks.whenTaskAdded { theTask -> if (theTask.name.startsWith("dex")) { theTask.outputs.upToDateWhen { false } theTask.doLast { task ->... }}}
Martin L.
Zaktualizowana odpowiedź w przypadku, gdy zadanie nie zostanie uruchomione.
cmcginty
Uważaj, w dzisiejszych czasach, gdy włączona jest pamięć podręczna zbudowana przez gradle, nie spowoduje to ponownego uruchomienia zadania, ale jego dane wyjściowe zostaną przywrócone z pamięci podręcznej.
Stephen Friedrich
25

Możesz użyć cleanTaskname

Powiedzmy, że masz

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

I chcesz zmusić, powiedzmy, zadanie2 do ponownego uruchomienia, możesz

someproject:cleanSometask2

przed uruchomieniem zadania, które to wszystko uruchamia.

Najwyraźniej w gradle każde zadanie, które rozumie AKTUALNE, również rozumie, jak się oczyścić.

c_maker
źródło
1
„Gradle clean” wyczyści wszystko w projekcie, w którym się znajdujesz. W zasadzie usuwa główny folder wyjściowy, którym domyślnie jest „/ build”. Czy tego szukałeś?
c_maker,
6
Nie. Nie spowoduje to przywrócenia aktualności, jeśli została przechwycona jako brak plików wyjściowych dla danego zadania. Oznacza to, że jeśli część kompilacji się zepsuła, ale ogólnie się powiodło, stan przechwycenia jest zły i muszę go wyczyścić.
Stefan Kendall,
1
normalnie „czyste” zadanie, które usuwa wszystko z $ buildDir, jest dostępne w skryptach budowania, ponieważ jest wprowadzane przez podstawową wtyczkę.
Rene Groeschke
5

Miałem trudny przypadek, w którym ustawienie outputs.upToDateWhen { false }wewnątrz zadania lub dodanie flagi --rerun-tasksnie pomogło, ponieważ zadanie setOnlyIfbyło ustawiane za falsekażdym razem, gdy je uruchomiłem.

Dodanie następujących elementów build.gradlewymuszających wykonanie 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
źródło