jueves, 25 de julio de 2013

Que es Gradle?


Hola a todos como están, en este post voy a escribir sobre que es “Gradle”, tema que me parece muy importante, ya que es lo que se está y va a manejar oficialmente para la construcción de nuestros proyectos “Android”. Espero que les interese, porque tiene muchas posibilidades, y realmente nos va a facilitar muchas cosas, el saber manejarlo.



Gradle es una herramienta para automatizar la construcción de nuestros proyectos, por ejemplo las tareas de compilación, testing, empaquetado y el despliegue de los mismos. Es muy flexible para la configuración, pero además ya tiene armadas las tareas para las mayoría de los proyectos por default. Esta herramienta es usado por grandes proyecto “Open Source” como “Spring”, “Hibernate”, y “Grails”. (También lo usan empresas como “LinkedIn” para sus proyectos)

Como programo las tareas?

Gradle usa un “Domain Specific Language” (DSL) basado en “Groovy” para declarar la formas de construir el proyecto. Así que para configurarlo simplemente podemos escribir código en Groovy, el cual en su sintaxis es muy similar a Java, lo que nos va  a hacer sencillo expresar, las tareas que queremos que realice.

Que hago con mis tareas en Ant?

Tiene soporte para tareas “Ant”, así que podríamos reutilizar las tareas que ya tengamos armadas con Ant, o armar tareas de Gradle que dependan de tareas en Ant. Soporta para publicar o tomar dependencias a los repositorios de “Maven” o “Ivy”, así que podemos reutilizar todo lo que usabamos de ellos.

Siempre realiza todo?

Maneja compilaciones incrementales, a que voy con eso, básicamente a que verifica si hubo algún cambio en el código fuente después de la última compilación, si es así re-compila todo, si no se ahorra la tarea.

Soporte la construcción de multi-proyectos?

Tiene un gran soporte para multi-proyectos, nuestro proyecto puede depender de solo un proyecto, o varios, nosotros podremos definir la relación de dependencias así Gradle se encargará de ello. Además también soporta construcciones parciales, digamos que nuestro proyecto depende de uno que necesita o no ser re-compilado, Gradle verificará esa condición, y si es necesario re-compila el proyecto del que dependemos antes de realizar esa tarea con el nuestro.

Que es el Gradle wrapper?

Esto nos permite realizar las tareas de Gradle en sistemas donde no lo tengamos instalado, es una buena forma de compartir el código fuente con el sistema de construcción del proyecto con el. O también para obligar la utilización de cierta versión de Gradle.

Cuanto me sale esto?

Este es un proyecto Open Source y es licenciado bajo Apache Software License (ASL)

Bueno, vamos a comenzar, como lo instalamos?

Antes que nada, tenemos que saber, que para usar esta herramienta debemos asegurarnos de que tenemos instalada en nuestro sistema una “Java Development Kit” (JDK)  5 o superior instalada, para eso simplemente abrimos una consola y tipeamos el comando: java -version
Nos debería salir algo como esto:
java version "1.7.0_21"
Java(TM) SE Runtime Environment (build 1.7.0_21-b11)
Java HotSpot(TM) 64-Bit Server VM (build 23.21-b01, mixed mode)

Si no es así, deberemos bajarla e instalarla a la versión libre “OpenJDK” o a la de “Oracle” de cualquiera de estas dos URL:

También es bueno aclarar, que Gradle como mencione antes utiliza Groovy, pero no necesitamos tenerlo instalado, ya que trae consigo las librerías necesarias del mismo, así que no prestará atención a si tenemos o no instalada alguna versión.

Y lo más importante, para descargarnos Gradle, deberemos dirigirnos a la siguiente URL:

Donde podremos descargar la última versión, o una anterior si lo necesitamos ;) una vez descargado, es muy sencillo, solo descomprimimos el zip donde nosotros queremos dejarlo instalado, y agregamos la ruta a la carpeta bin en su interior a nuestro PATH.
Una vez realizado esto  si tipeamos en la consola el comando: gradle -v deberemos terminar teniendo una salida como esta, obviamente que con las características de su PC.

------------------------------------------------------------
Gradle 1.6
------------------------------------------------------------

Gradle build time: martes 7 de mayo de 2013 09h'12 UTC
Groovy: 1.8.6
Ant: Apache Ant(TM) version 1.8.4 compiled on May 22 2012
Ivy: 2.2.0
JVM: 1.7.0_21 (Oracle Corporation 23.21-b01)
OS: Linux 3.2.29 amd64



Escribir nuestro primer script

Ahora que sabemos que hemos instalado Gradle de manera correcta, nosotros podríamos crear nuestros script para manejar nuestros proyectos, para comenzar a ver de qué se trata la sintaxis, vamos a crear el clásico Hola Mundo :D
Para eso creamos un archivo llamado “build.gradle” y dentro del mismo escribimos el siguiente código:

task holaMundo << {
println 'Hola mundo!!!'
}

Con esto nosotros definimos la tarea holaMundo la cual por la llamada a la función “println” debería imprimir en la consola Hola Mundo!!!, si queremos ver que funciona correctame, en la consola nos dirigimos a la carpeta donde creamos el archivo, y ejecutamos el siguiente comando: gradle holaMundo
Y la salida por consola debería ser similar a esta:

:holaMundo
Hola mundo!!!

BUILD SUCCESSFUL

Total time: 12.639 secs

Como pueden ver en la salida, nos muestra algo de información extra, si nosotros no queremos eso, y queremos que muestre únicamente el resultado de la tarea, debemos agregar el parámetro --quiet, quedando el comando de la siguiente manera: gradle --quiet holaMundo
Algunas tareas por default

Cuando creamos un proyecto con algunas tareas, nosotros podríamos querer saber si existen otras tareas habilitadas en nuestro proyecto, para eso en el directorio del proyecto, tipeamos el siguiente comando: gradle -q tasks y deberíamos ver una salida como esta:

------------------------------------------------------------
All tasks runnable from root project
------------------------------------------------------------

Build Setup tasks
-----------------
setupBuild - Initializes a new Gradle build. [incubating]

Help tasks
----------
dependencies - Displays all dependencies declared in root project 'Descargas'.
dependencyInsight - Displays the insight into a specific dependency in root project 'Descargas'.
help - Displays a help message
projects - Displays the sub-projects of root project 'Descargas'.
properties - Displays the properties of root project 'Descargas'.
tasks - Displays the tasks runnable from root project 'Descargas' (some of the displayed tasks may belong to subprojects).

Other tasks
-----------
holaMundo

To see all tasks and more detail, run with --all.

Si quisiéramos ver la ayuda, podríamos usar el siguiente comando: gradle -q help o para ver una lista más extensa gradle --help
Si llegamos a agregarles diferentes propiedades a nuestras tareas (cosa que vamos a ver más adelante) podríamos ver las tareas disponible tipeando este comando: gradle -q properties pero todavía no hemos configurado ninguna :D como tambíen ver las dependencias que hemos configurado: gradle -q dependencies y si hubiéramos configurado sub-proyecto gradle -q projects

Abreviación del nombre de las tareas

Algo que puede resultarnos útil, es que no necesariamente debemos escribir el nombre completo de las tareas, por ejemplo los siguientes dos comandos deberían funcionar sin ningún tipo de problemas: gradle hola y gradle -q hM
Ahora si quisieramos ejecutar múltiples tareas deberíamos usar el siguiente comando: gradle holaMundo tasks de esta manera Gradle realizaría las tareas en el orden en que fueron declaradas ;)

Web Oficial:

Bueno eso es todo por este post, espero que les allá gustado e interesado el tema, ya que es lo que vamos a usar de manera oficial para gestionar nuestros proyectos Android de ahora en más :D