Redefinindo a propriedade UP-TO-DATE das tarefas gradle?


106

Existe uma maneira de forçar uma tarefa do Gradle a ser executada novamente ou redefinir todas as tarefas para o estado não ATUALIZADO?

Respostas:


133

Tente executar sua construção com -C rebuildo cache do Gradle que reconstrói.

Em versões mais recentes do Gradle, use --rerun-tasks


89

Se você deseja que apenas uma única tarefa seja sempre executada, você pode definir a outputspropriedade dentro da tarefa.

outputs.upToDateWhen { false }

Esteja ciente de que, se sua tarefa não tiver nenhuma entrada de arquivo definida, o Gradle pode pular a tarefa, mesmo ao usar o código acima. Por exemplo, em uma tarefa Zip ou Copiar, deve haver pelo menos um arquivo fornecido na fase de configuração da definição da tarefa.


14
Isso não faz nada por mim. Eu o adicionei a uma tarefa e fiquei "ATUALIZADO". O engraçado é que é um ZipTask e apaguei o arquivo de destino.
maaartinus

5
Isso é incrível para uso como este:tasks.whenTaskAdded { theTask -> if (theTask.name.startsWith("dex")) { theTask.outputs.upToDateWhen { false } theTask.doLast { task ->... }}}
Martin L.

Resposta atualizada para o caso em que a tarefa não será executada.
cmcginty

Esteja ciente de que hoje em dia, quando o cache integrado do gradle estiver habilitado, isso não fará com que a tarefa seja executada novamente, mas sua saída será apenas restaurada do cache.
Stephen Friedrich

25

Você pode usar cleanTaskname

Digamos que você tem

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

E você quer forçar, digamos, sometask2 a ser executado novamente, você pode

someproject:cleanSometask2

antes de executar a tarefa que executa tudo.

Aparentemente, no gradle, todas as tarefas que entendem ATUALIZAÇÃO também entendem como se limpar.


1
'gradle clean' irá limpar tudo para o projeto em que você está. Basicamente, ele exclui sua pasta de saída principal, que é '/ build' por padrão. É isso que você estava procurando?
c_maker

6
Não. Isso não redefinirá a atualização se a atualização for capturada como nenhum arquivo de saída para uma determinada tarefa. Ou seja, se eu tive alguma parte da quebra de compilação, mas tive sucesso no geral, o estado capturado está errado e eu preciso limpá-lo.
Stefan Kendall,

1
normalmente a tarefa 'limpa' que exclui tudo em $ buildDir está disponível em scripts de construção conforme é introduzida pelo plug-in base.
Rene Groeschke

5

Tive um caso difícil em que definir outputs.upToDateWhen { false }dentro da tarefa ou adicionar o sinalizador --rerun-tasksnão ajudava, pois a tarefa setOnlyIfcontinuava sendo definida para falsecada vez que eu a executava.

Adicionar o seguinte para build.gradleforçar a execução 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 }
    }
  }
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.