Réinitialiser la propriété UP-TO-DATE des tâches gradle?

106

Existe-t-il un moyen de forcer une tâche gradle à s'exécuter à nouveau ou de réinitialiser toutes les tâches à l'état pas à jour?

Stefan Kendall
la source

Réponses:

133

Essayez d'exécuter votre build avec -C rebuildqui reconstruit le cache de Gradle.

Dans les versions plus récentes de Gradle, utilisez --rerun-tasks

René Groeschke
la source
89

Si vous souhaitez qu'une seule tâche soit toujours exécutée, vous pouvez définir la outputspropriété à l'intérieur de la tâche.

outputs.upToDateWhen { false }

Veuillez noter que si votre tâche n'a pas d'entrées de fichier définies, Gradle peut ignorer la tâche, même en utilisant le code ci-dessus. Par exemple, dans une tâche Zip ou Copy, au moins un fichier doit être fourni dans la phase de configuration de la définition de tâche.

cmcginty
la source
14
Cela ne fait rien pour moi. Je l'ai ajouté à une tâche et j'obtiens "UP-TO-DATE". Le plus drôle, c'est que c'est une ZipTask et j'ai supprimé l'archive de destination.
maaartinus du
5
C'est incroyable pour une utilisation comme celle-ci:tasks.whenTaskAdded { theTask -> if (theTask.name.startsWith("dex")) { theTask.outputs.upToDateWhen { false } theTask.doLast { task ->... }}}
Martin L.
Réponse mise à jour pour le cas où la tâche ne sera pas exécutée.
cmcginty
Attention, de nos jours, lorsque le cache intégré gradle est activé, cela ne provoquera pas la réexécution de la tâche, mais sa sortie sera simplement restaurée à partir du cache.
Stephen Friedrich
25

Vous pouvez utiliser cleanTaskname

Disons que vous avez

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

Et vous voulez forcer, disons, quelque chose à exécuter à nouveau, vous pouvez

someproject:cleanSometask2

avant d'exécuter la tâche qui exécute tout.

Apparemment, en gradle, chaque tâche qui comprend UP-TO-DATE comprend également comment se nettoyer.

c_maker
la source
1
«gradle clean» nettoiera tout pour le projet dans lequel vous vous trouvez. Il supprime essentiellement votre dossier de sortie principal qui est «/ build» par défaut. Est ce que c'est ce que vous recherchiez?
c_maker
6
Non. Cela ne sera pas remis à jour si à jour a été capturé comme aucun fichier de sortie pour une tâche donnée. Autrement dit, si j'ai eu une partie de la pause de construction mais que je réussis globalement, l'état capturé est incorrect et je dois l'effacer.
Stefan Kendall
1
normalement, la tâche «propre» qui supprime tout dans $ buildDir est disponible dans les scripts de construction telle qu'elle est introduite par le plugin de base.
Rene Groeschke
5

J'ai eu un cas difficile où la configuration outputs.upToDateWhen { false }à l'intérieur de la tâche ou l'ajout du drapeau --rerun-tasksn'aidait pas car la tâche était setOnlyIftoujours définie à falsechaque fois que je l'exécutais.

Ajout de ce qui suit pour build.gradleforcer l'exécution de 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
la source