jueves, 1 de agosto de 2013

Como crear tareas con Gradle?

Hola a todos, en este nuevo post volvemos a ver algo sobre “Gradle”, en este caso vamos a comenzar a ver algo más divertido, como empezar a escribir scripts con esta herramienta, así que comencemos ;)



En Gradle,  proyectos (projects) y tareas (tasks) son dos conceptos muy importantes, siempre vamos a tener uno o más proyectos, y cada uno va  consistir en un componente a construir esto puede ser la construcción de un jar, pero no necesariamente tiene que compilar algo, sino que puede ser simplemente el copiar archivos de un lugar a otro o el deploy de una aplicación web. Y dentro de cada uno de estos proyectos vamos a tener una o más tareas a realizar. Con la combinación de estos dos componentes vamos a escribir nuestro scripts.

En los anteriore post sobre el tema:

Nosotros escribimos nuestro primer scripts, así que si recordamos un poco, por defecto cuando ejecutemos “gradle”, este va a buscar un archivo llamado “build.gradle” en nuestro directorio actual. En el mismo vamos a escribir:

project.description = "Proyecto sencillo"

task sencillo << {
    println 'Corriendo una tarea del proyecto ' + project.description
}

Si corremos el script con el comando: gradle sencillo
Obtenemos esta salida:

:sencillo
Corriendo una tarea del proyecto Proyecto sencillo

BUILD SUCCESSFUL

Total time: 5.108 secs

Vamos a ir bien despacio, lo que realiza gradle acá es que lee el script, entonces genera el proyecto y verifica cuáles son las tareas que tiene que realizar, y las ejecuta. En resumen, gradle genera el proyecto por nosotros, lo que es importante tener en cuenta, es que nosotros vamos a poder utilizar una buena cantidad de propiedades y métodos que nos generó gradle.
Como pueden ver, básicamente cuando llamamos a project podemos acceder a todas sus variables y metodos, pero si queremos podemos evitarlo y gradle automáticamente va a intentar mapearlos con el objeto project de nuestro script, un ejemplo de como realizar el mismo script.

setDescription("Proyecto sencillo")

task sencillo << {
    println 'Corriendo una tarea del proyecto ' + project.
    getDescription()
}

Definiendo tareas

Como dijimos antes, cada proyecto tiene al menos una tarea, la que va a ejecutar algún tipo de acción, al ejecutarse esa tarea, gradle soporta algunas formas diferentes de agregar esas acciones a nuestras tareas.
Nosotros podemos usar los metodos “doLast” (tambien se puede llamar a este método con los símbolos “<<”)y “doFirst” para agregar acciones a nuestras tareas. Como dicen sus nombres, el primero agregara acciones al final de la lista, en la tareas, y el segundo al comienzo de la misma. Como podrán ver, al igual que con el objeto project, nosotros también vamos a poder  acceder a métodos y propiedades de nuestras tareas. Ejemplo:

task primero{
    doFirst{
println 'Corriendo primero'
    }
}

task segundo{
    doLast{ Task task ->
         println "Corriendo ${task.name}"     
    }
}

task tercero << { taskObject ->
    println 'Corriendo ' + taskObject.name
}

Y con el comando gradle primero segundo tercero podemos ver la salida:

:primero
Corriendo primero
:segundo
Corriendo segundo
:tercero
Corriendo tercero

BUILD SUCCESSFUL

Total time: 3.659 secs

También para definir una acción podríamos usar la interfaz Action() donde debemos implementar el método “execute”, un ejemplo:

task primero {
    doFirst {
new Action() {
   void execute(task){
    println "Corriendo ${task.name}"
   }
}
    }
}

Pero esto no es Java? Es Groovy a no olvidarse

Debemos recordar que al escribir esto, lo estamos haciendo con Groovy, a no olvidarse de eso, ya que vamos a poder utilizar las herramientas que el nos provee :D así que por ejemplo como vimos antes, (con Gstring que es definido con las comillas dobles) por ejemplo colocando esto ${....} en una strings, podríamos referenciar a una variable. Para ver otras características, este es un ejemplo:

task numeros << {
    (1..4).each { numero ->
     def cuadrado = numero * numero
println "El cuadrado de ${numero} = ${cuadrado}"     
    }
}

task lista {
    doFirst {
         def lista = ['Groovy', 'Gradle']
    println lista.collect {it[0].toLowerCase()}.join('&')
    }
}

Esta sería la salida:

bash-4.2$  gradle -q numeros lista
El cuadrado de 1 = 1
El cuadrado de 2 = 4
El cuadrado de 3 = 9
El cuadrado de 4 = 16
g&g




Espero que les guste el tema, de a poco vamos a ir aprendiendo más sobre la sintaxis y posibilidades que tenemos para escribir nuestros scripts, para luego realmente meternos en la configuración de proyectos con esta herramienta, pero para eso vamos a necesitar estos conocimientos previos.



Saludos a todos, Gabriel