¿Hay alguna manera de forzar la ejecución de una tarea de Gradle de nuevo o restablecer todas las tareas al estado no ACTUALIZADO ?
¿Hay alguna manera de forzar la ejecución de una tarea de Gradle de nuevo o restablecer todas las tareas al estado no ACTUALIZADO ?
Respuestas:
Intente ejecutar su compilación con -C rebuild
eso reconstruye la caché de Gradle.
En versiones más recientes de Gradle, use --rerun-tasks
Si desea que se ejecute siempre una única tarea, puede establecer la outputs
propiedad 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.
tasks.whenTaskAdded { theTask -> if (theTask.name.startsWith("dex")) { theTask.outputs.upToDateWhen { false } theTask.doLast { task ->... }}}
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.
Tuve un caso difícil en el que configurar outputs.upToDateWhen { false }
dentro de la tarea o agregar la bandera --rerun-tasks
no ayudó, ya que la tarea se setOnlyIf
seguía configurando false
cada vez que la ejecutaba.
Añadiendo lo siguiente para build.gradle
forzar 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 }
}
}
}