Reimpostare la proprietà UP-TO-DATE delle attività gradle?


106

Esiste un modo per forzare la ripetizione di un'attività gradle o ripristinare tutte le attività allo stato non AGGIORNATO ?

Risposte:


133

Prova a eseguire la tua build con -C rebuildche ricostruisce la cache di Gradle.

Nelle versioni più recenti di Gradle, usa --rerun-tasks


89

Se desideri che una singola attività venga sempre eseguita, puoi impostare la outputsproprietà all'interno dell'attività.

outputs.upToDateWhen { false }

Tieni presente che se la tua attività non ha input di file definiti, Gradle potrebbe saltare l'attività, anche quando si utilizza il codice sopra. Ad esempio, in un'attività Zip o Copia deve essere fornito almeno un file nella fase di configurazione della definizione dell'attività.


14
Questo non fa niente per me. L'ho aggiunto a un'attività e ottengo "AGGIORNATO". La cosa divertente è che è un ZipTask e ho cancellato l'archivio di destinazione.
maaartinus

5
Questo è incredibile per un utilizzo come questo:tasks.whenTaskAdded { theTask -> if (theTask.name.startsWith("dex")) { theTask.outputs.upToDateWhen { false } theTask.doLast { task ->... }}}
Martin L.

Risposta aggiornata per i casi in cui l'attività non verrà eseguita.
cmcginty

Attenzione che oggigiorno, quando la cache compilata gradle è abilitata, l'attività non verrà eseguita nuovamente, ma il suo output verrà semplicemente ripristinato dalla cache.
Stephen Friedrich

25

Puoi usare cleanTaskname

Diciamo che hai

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

E vuoi forzare diciamo che Sometask2 funzioni di nuovo che puoi

someproject:cleanSometask2

prima di eseguire l'attività che esegue tutto.

Apparentemente in gradle, ogni attività che comprende UP-TO-DATE capisce anche come pulirsi.


1
"gradle clean" pulirà tutto per il progetto in cui ti trovi. In pratica cancella la cartella di output principale che è "/ build" per impostazione predefinita. È questo quello che stavi cercando?
c_maker

6
No. Ciò non verrà reimpostato se l'aggiornamento è stato acquisito come nessun file di output per una determinata attività. Cioè, se ho avuto una parte dell'interruzione di build ma ho avuto successo nel complesso, lo stato acquisito è sbagliato e devo cancellarlo.
Stefan Kendall

1
normalmente l'attività 'clean' che elimina tutto in $ buildDir è disponibile negli script di build poiché viene introdotta dal plugin di base.
Rene Groeschke

5

Ho avuto un caso difficile in cui l'impostazione outputs.upToDateWhen { false }all'interno dell'attività o l'aggiunta del flag --rerun-tasksnon aiutava poiché l'attività setOnlyIfcontinuava a essere impostata sufalse ogni volta che l'ho eseguita.

Aggiungendo quanto segue per build.gradleforzare l'esecuzione di 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 }
    }
  }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.