Gradle Task Para Llamar A Otras Tareas En Orden


Estoy haciendo una tarea en gradle que necesita llamar a varias otras tareas.

Esto es lo que tengo:

task ci(dependsOn: [
    clean,
    build,
    test
])

Lo que es extraño es la salida que veo:

gradle ci
:compileJava
:processResources UP-TO-DATE
:classes
:jar
:assemble
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:check UP-TO-DATE
:clean             // cleaning after the build
:build
:ci

Tenga en cuenta que la limpieza se produce después del objetivo de compilación, lo que borra mi compilación.

Si cambio mi tarea a:

task ci(dependsOn: [
    clean,
    test
])

Entonces parece ejecutarse en el orden correcto:

:clean UP-TO-DATE    // cleaning before the build
:compileJava
:processResources UP-TO-DATE
:classes
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:ci UP-TO-DATE

Intenté arreglar el objetivo original añadiendo una compilación.dependsOn limpio, pero esto parece no tener afectar.

Cualquier ayuda es apreciada.

Author: dev, 2013-07-12

4 answers

Parece que me he topado con el tema que se debate en GRADLE-427 en el que gradle determina el mejor orden para ejecutar las tareas. Resolví mi problema siguiendo los consejos en el mismo que también está documentado en la Guía del Usuario de Gradle - Sección 15.5 para establecer el orden entre tareas dispares. Mi objetivo final ci aparece así como:

task ci(dependsOn: ['clean', 'build', 'uploadArchives'])
build.mustRunAfter clean
uploadArchives.mustRunAfter build

Y ahora todo funciona como se esperaba.

 39
Author: dev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-19 23:27:15

Versión TLDR: Así es como lo hice en uno de mis proyectos (sin introducir dependencias artificiales).

//--- build aliases : define a synonym here if you want a shortcut to run multiple targets

def buildAliases = [
   'all' : ['clean', 'assemble', 'runProvisioner', 'stopTomcat', 'installTomcat', 'deployToTomcat', 'startTomcat'],
   'rebuild' : ['clean', 'assemble']
]
def expandedTaskList = []

gradle.startParameter.taskNames.each {
    expandedTaskList << (buildAliases[it] ? buildAliases[it] : it)
}

gradle.startParameter.taskNames = expandedTaskList.flatten()

println "\n\n\texpanded task list: ${gradle.startParameter.taskNames }\n\n"

Para más información, ver :

Https://caffeineinduced.wordpress.com/2015/01/25/run-a-list-of-gradle-tasks-in-specific-order/

 8
Author: Lance,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-31 16:17:35

Preferiría no agregar la tarea wrapper solo para asegurarme de un pedido.

En este caso, mi solución es la siguiente -

run.dependsOn 'clean' compileJava.mustRunAfter 'clean'

Esto asegura que, clean la tarea se ejecute antes que gradle ejecute compileJava. Tan efectivamente, va a crear una nueva construcción todo el tiempo.

Espero que esto ayude.

 2
Author: Kunal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-17 06:36:11

Usando alguna bondad Groovy / Gradle, la solución se puede mejorar aún más con lo siguiente:

def taskNames = [...] // list of task names

task('lastTask', dependsOn: taskNames)

taskNames.inject(null) { acc, val ->
  if (acc != null) tasks[val].mustRunAfter acc
  tasks[val]
}

De esta manera, puede tener un lugar con una lista de tareas.

 0
Author: Nikita Skvortsov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-12 12:56:52