finalizedBy
Cómo decir con finalizedBy que tras una tarea se invoque automáticamente otra tarea. Otra forma de establecer el orden en el que queremos que las tareas organicen su orden de ejecución.
finalizedBy
permite señalizarle a Gradle que cuando una tarea finalice de forma satisfactoria, se debe ejecutar automáticamente otra tarea. En el siguiente ejemplo, tenemos dos tareas: lint y validate. Por simplificar, vamos a reducir el código de sus tareas a un println:
task lint << {
println "Linteando el código..."
}
task validate << {
println "Validando que el código esté bien..."
}
Si quisiésemos que al invocar la tarea lint
, la tarea validate
se invocase a continuación, podríamos señalar la dependencia entre ambas tareas mediante un finalizedBy
:
lint.finalizedBy validate
De este modo, podríamos tener una tarea mayor dividida en pequeñas subtareas, y mediante bloques finalizedBy
ir estableciendo la conexión entre cada una de estas subtareas para que se vayan encadenando una tras otra. Por ejemplo, si encadenamos la segunda tarea con una tercera tarea, podemos fabricar una cadena más larga.
task lintJava << {
println "Estoy validando mi Java"
}
task lintXML << {
println "Estoy validando mi XML"
}
task lintProperties << {
println "Estoy validando mis properties"
}
lintJava.finalizedBy lintXML
lintXML.finalizedBy lintProperties
Desplegar transcripción del episodio
Bien. Dije que el anterior era el último vídeo que le dedicaba a tareas, pero hay una cosa de la que me he olvidado, y que también quería comentar. Hemos visto cómo podíamos usar dependencias para obligar a ejecutar unas tareas antes que otras. Simplemente, quiero comentar la posibilidad de hacer justo lo contrario, es decir, de ejecutar unas tareas después de otras.
Vamos a partir de este ejemplo, también básico, como el que vimos en su momento. tarea A: println de ejecutando A
, tarea B: println de ejecutando B
. Escribo gradle -q a
y me dice ejecutando tarea A
... ¿siempre es tan lento? gradle -q b
y me dice ejecutando tarea B
.
¿Cómo puedo hacer, que por ejemplo, la tarea A se ejecute antes que la tarea B? Usando dependsAll a. Esto ya lo he dicho.
¿Cómo podemos hacer lo contrario? ¿Cómo podemos hacer que después de ejecutar la tarea A, necesariamente se ejecute la tarea B? Tenemos una propiedad, mediante la cual podemos decirle a Gradle que después de ejecutar una tarea ejecute otra. Tan sencillo como usar la propiedad finalizedBy
. De este modo, si le digo a.finalizedBy b
lo que va a hacer es que cuando se termine de ejecutar A, va a ejecutar automáticamente B.
Por ejemplo, si ahora le digo gradle -q a
, lo que va a hacer es ejecutar la tarea A, y debajo va a ejecutar la tarea B. ¿Puedo hacer más finalizedBy? Sí. Todo lo que tendría que hacer es declarar mi tarea C, por ejemplo, y después decirle que la tarea B tiene que finalizarse con la tarea C.
En sí esta propiedad, y por eso la quería dejar para un vídeo independiente, es una propiedad que aún está en desarrollo, y que puede variar. Es posible que con el tiempo cambie. En este momento, no parece posible escribir un array de tareas, para que se puedan ejecutar varias seguidas.
De momento se tiene que indicar así. Decimos que una tarea finaliza con otra, y que esa tarea finaliza con una tercera tarea.
Si ahora le digo gradle -q a
, como veis me va a decir ejecutando tarea A, ejecutando tarea B, ejecutando tarea C
. Todo va, digamos, seguido.
En esto consiste finalizedBy. Como digo, un método muy simple para ejecutar unas tareas después de otras.