traduccion - Comprender la dependencia de tareas de Gradle(dependsOn)
gradle vs maven (2)
El modelo de tareas de Gradle es "plano" y no tiene un concepto de agregación. (Es importante tener en cuenta que TaskInternal#execute
es un método interno y no se debe TaskInternal#execute
desde scripts de compilación). La agregación a menudo se simula con una tarea de ciclo de vida (una tarea con dependencias de tareas pero sin ninguna acción de tarea):
task allTests {
dependsOn tasks.withType(Test)
}
Además de dependsOn
, las siguientes relaciones de tareas son compatibles: mustRunAfter
, shouldRunAfter
y finalizedBy
.
Dos preguntas:
- ¿Cuál es la forma de Gradle de especificar que 1 tarea se compone de varias otras tareas?
- Parece que el método
taskName.execute()
detaskName.execute()
no respeta las relaciones detaskName
detaskName
es así? ¿Qué es lo que funciona?
Más antecedentes:
En este momento tengo un script de compilación que no tiene complementos (no Java en otras palabras). Quiero una tarea llamada tests
que ejecutará todas mis tareas de prueba. Tengo 3 de esas tareas. Llámelos task1, task2 y task3.
Podría decir tests.dependsOn [''task1'', ''task2'', ''task3'']
Esto es un poco inestable porque la relación parece ser una tests.isComprisedOf [''task1'', ''task2'', ''task3'']
Se tests.isComprisedOf [''task1'', ''task2'', ''task3'']
Yo podría decir:
task tests << {
task1.execute()
task2.execute()
task3.execute()
}
pero luego task3, que a su vez depende de taskSetup, se ejecuta sin ejecutar taskSetup. En otras palabras, la llamada a execute () no parece respetar la estrategia de resolución de dependencias de gradle.
Una última pequeña queja (realmente me encanta gradle por cierto), es que es difícil buscar en este tema porque la dependencia significa dos cosas diferentes en gradle: depende de las dependencias de estilo y de las dependencias de estilo de biblioteca.
Normalmente, no task.execute()
.
Puede especificar que una tarea se compone de otras tareas de la siguiente manera:
task task1 << {
println "Hello"
}
task task2 << {
println "World"
}
task task3(dependsOn: ''task3dependency'') << {
println "QBert"
}
task task3dependency << {
println "MR"
}
task tests(dependsOn: [''task1'', ''task2'', ''task3''])
Esto produce:
$ gradle tests
:task1
Hello
:task2
World
:task3dependency
MR
:task3
QBert
:tests
BUILD SUCCESSFUL
Tenga en cuenta que el orden en el que se ejecutan las tareas de dependencia no siempre está garantizado, pero puede mitigarlo especificando el orden task2.mustRunAfter task1
. Sin embargo, normalmente las tareas se ejecutan en el orden esperado.
Además, debe leer sobre el ciclo de vida de compilación de Gradle . Cuando utiliza la task task1 << {...}
sintaxis task task1 << {...}
, está especificando un cierre que se ejecuta en la fase de ejecución de la tarea. Antes de ejecutar, la fase de configuración evalúa su script de construcción y determina las tareas que se ejecutarán y en qué orden. Cuando ejecuta tareas manualmente, como en:
task tests << {
task1.execute()
task2.execute()
task3.execute()
}
ha pasado por alto la capacidad de Gradle para evaluar las dependencias de tareas de task3, por lo tanto, solo ejecuta task3.