¿Restablecer la propiedad UP-TO-DATE de las tareas de Gradle?

106

¿Hay alguna manera de forzar la ejecución de una tarea de Gradle de nuevo o restablecer todas las tareas al estado no ACTUALIZADO ?

Stefan Kendall
fuente

Respuestas:

133

Intente ejecutar su compilación con -C rebuildeso reconstruye la caché de Gradle.

En versiones más recientes de Gradle, use --rerun-tasks

Rene Groeschke
fuente
89

Si desea que se ejecute siempre una única tarea, puede establecer la outputspropiedad dentro de la tarea.

outputs.upToDateWhen { false }

Tenga en cuenta que si su tarea no tiene ninguna entrada de archivo definida, Gradle puede omitir la tarea, incluso cuando utilice el código anterior. Por ejemplo, en una tarea Zip o Copy, es necesario que se proporcione al menos un archivo en la fase de configuración de la definición de la tarea.

cmcginty
fuente
14
Esto no hace nada por mí. Lo agregué a una tarea y obtuve "ACTUALIZADO". Lo curioso es que es una ZipTask y borré el archivo de destino.
maaartinus
5
Esto es increíble para un uso como este:tasks.whenTaskAdded { theTask -> if (theTask.name.startsWith("dex")) { theTask.outputs.upToDateWhen { false } theTask.doLast { task ->... }}}
Martin L.
Respuesta actualizada para el caso en que la tarea no se ejecutará.
cmcginty
Tenga en cuenta que, hoy en día, cuando se habilita la caché construida de Gradle, esto no hará que la tarea se ejecute nuevamente, pero su salida simplemente se restaurará desde la caché.
Stephen Friedrich
25

Puedes usar cleanTaskname

Digamos que tienes

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

Y quieres forzar, digamos, alguna tarea2 a ejecutarse de nuevo, puedes

someproject:cleanSometask2

antes de ejecutar la tarea que lo ejecuta todo.

Aparentemente, en Gradle, cada tarea que comprende ACTUALIZACIÓN también comprende cómo limpiarse a sí misma.

c_maker
fuente
1
'gradle clean' limpiará todo para el proyecto en el que se encuentra. Básicamente, elimina la carpeta de salida principal que es '/ build' por defecto. Esto es lo que estabas buscando?
c_maker
6
No. Eso no se volverá a configurar como actualizado si se capturó la actualización como archivos sin salida para una tarea determinada. Es decir, si tuve alguna parte de la interrupción de la compilación pero tuve éxito en general, el estado capturado es incorrecto y necesito borrarlo.
Stefan Kendall
1
Normalmente, la tarea 'limpia' que elimina todo en $ buildDir está disponible en los scripts de compilación tal como la introduce el complemento base.
Rene Groeschke
5

Tuve un caso difícil en el que configurar outputs.upToDateWhen { false }dentro de la tarea o agregar la bandera --rerun-tasksno ayudó, ya que la tarea se setOnlyIfseguía configurando falsecada vez que la ejecutaba.

Añadiendo lo siguiente para build.gradleforzar la ejecución 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
fuente