miércoles, 7 de agosto de 2013

Y como seguimos trabajando con las tareas en Gradle?

Hola a todos, vamos a volver con otros post sobre esta herramienta, en este caso vamos a continuar viendo, el tema de las tareas, que otras configuraciones y posibilidades tenemos para trabajar con ellas.





Como definir dependencias entre tareas?


Hasta ahora lo que vimos, fue bastante simple, definimo algunas tareas dentro de un proyecto, que no tenían que ver unas con otras. Pero normalmente vamos a necesitar en muchas ocasiones, que cuando escribimos una tarea, esta se realice después de que haya finalizado alguna otra, por ejemplo tenemos dos tareas una que compila el proyecto y la otra lo ejecuta. En este caso vamos a tener esta dependencia bien marcada, nosotros vamos a necesitar que la segunda se ejecute una vez el proyecto se halla compilado, si no no tendría sentido tratar de ejecutarlo ;) En gradle esto lo podemos hacer llamando a “dependsOn”, un ejemplo:


task primera << { task ->
    println "Corriendo tarea ${task.name}"
}


task segunda << { task ->
    println "Corriendo tarea ${task.name}"
}


// definimos la dependencia
segunda.dependsOn 'primera'


Y si a esto lo ejecutamos, vamos a ver una salida como esta:


bash-4.2$ gradle segunda
:primera
Corriendo tarea primera
:segunda
Corriendo tarea segunda


BUILD SUCCESSFUL


Total time: 5.623 secs


Otra manera de hacerlo de manera similar sería  cuando definimos la tarea, por ejemplo:


task primera << { task ->
    println "Corriendo tarea ${task.name}"
}


task segunda << { task ->
    println "Corriendo tarea ${task.name}"
}


// definimos la dependencia
segunda.dependsOn 'primera'


// definimos la tercer tarea con la dependencia
task tercera(dependsOn: 'segunda') << { task ->
    println  "Corriendo tarea ${task.name}"
}


Y esta sería la salida:


bash-4.2$ gradle tercera
:primera
Corriendo tarea primera
:segunda
Corriendo tarea segunda
:tercera
Corriendo tarea tercera


BUILD SUCCESSFUL


Total time: 3.637 secs


Algo importante a saber es que las dependencias gradle las carga de manera “lazy”, lo que va a hacer es que el mismo las carga en la fase de configuración y no en la de ejecución del script, así que no importa en qué orden las colocamos, cuando se ejecute el script, las va a ir levantando de manera ordenada como corresponde.


Configurando una tarea por defecto


Como vimos hasta ahora, cuando ejecutamos un archivo de configuración siempre llamamos al programa en la carpeta donde se encuentra el archivo con el nombre  de la tarea a ejecutar, pero lo que normalmente vamos necesitar es que se ejecute una tarea en particular primero y que así siga el flujo. Para eso podemos configurar una tarea por defecto, para eso vamos a necesitar un código como el siguiente:


defaultTasks 'primera', 'segunda'


task primera << { task ->
    println "Corriendo tarea ${task.name}"
}


task segunda << { task ->
    println "Corriendo tarea ${task.name}"
}


// definimos la dependencia
segunda.dependsOn 'primera'


Esta es la salida:


bash-4.2$ gradle
:primera
Corriendo tarea primera
:segunda
Corriendo tarea segunda


BUILD SUCCESSFUL


Total time: 5.2 secs


Podemos agregarle una descripción a cada tarea con un código similar a este:


task primera (description: “primera tarea a realizar”)<< {
    println "Corriendo tarea ${task.name}"
}


Y ver eso con el comando: gradle tasks -all


Agrupar las tareas definiciendo un grupo con la siguiente linea: def grupoTarea = ‘principales’


Y luego en cada tarea:
task primera (description: “primera tarea a realizar”, group: grupoTarea)<< {
    println "Corriendo tarea ${task.name}"
}



Definiendo tareas de otra forma


Por ejemplo usando un string en el lugar del nombre:


task “primera” << { tasks ->
    println "Corriendo tarea ${task.name}"
}


Con una string definida aparte:


def primera = ‘primera’


task primera << { tasks ->
    println "Corriendo tarea ${task.name}"
}


Si lo quisiéramos también podríamos llegar a crearlas de manera dinámica con un “loop” en Groovy.


Evitar tareas


Podemos evitarlas con el método onlyIf donde podemos hacer que una tarea se ejecute solo si cumple la condición que allí configuramos, o lanzando un StopExecutionException, cuando se cumple la condición que espesifiquemos. Otra opción para evitarla sería configurar el parametro “enabled” dentro de la tarea, con “true” o “false” de acuerdo a nuestra necesidad.
O excluirla desde la linea de comando con el parámetro -x seguido del nombre de la tarea cuando llamamos a gradle, otra gran característica es que esta herramienta usa un sistema de construcción incremental, así que si no hubo modificaciones y la entrada y salida son las mismas en una tarea automaticamente eviataria hacer la tarea para no malgastar tiempo, para eso debemos configruar las variables “input” y “output” en nuestra tarea, para que gradle pueda realizar esa comprobación y decidir si tiene que realizarla o no ;)


Sitio Oficial:


Bueno espero que les sea de utilidad el post, mas adelante continuaremos viendo más caracteristicas de esta herramienta, ademas de a poco comenzar a ver cosas más utiles para su uso, nos vemos en el próximo post.


Saludos a todos, Gabriel