Gradle

En artículos previos, Evolución de build tools e Introducción a Gradle, hemos mencionado a gradle como la build automation tool flexible y poderosa que nos permite personalizar nuestros builds ya que se basa en scripting. Para reforzar lo mencionado anteriormente, en esta ocasión mostraremos como crear tareas.

Este artículo no tiene como fin mostrar un script complejo, por el contrario mostraremos las diversas formas de crear una tarea de manera sencilla y como introducirla dentro de la gestión de gradle.

Por defecto, cada nueva tarea creada es de tipo org.gradle.api.DefaultTask cuya interface es org.gradle.api.Task.

El archivo build.gradle con el que trabajeremos durante el artiículo es el siguiente:

group 'io.eddumelendez.gradle'
version '1.0-SNAPSHOT'

apply plugin: 'java'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
}

Si ejecutamos gradle tasks, podremos visualizar todas las tareas que nuestro proyecto gradle cuenta actualmente. En este proyecto, las tareas se muestran agrupadas en Build tasks, Build Setup tasks, Documentation tasks, Help tasks y Verification tasks. A continuación, procederemos a crear nuestra primera tarea:

task printProjectInfo (1)
printProjectInfo << { (2)
    println "groupId: ${project.group} artifactId: ${project.name} version: ${version}"
}
  1. Definimos la tarea printProjectInfo

  2. Asignamos el bloque creado a printProjectInfo

Para ejecutar la tarea, en nuestro terminal ejecutamos gradle printProjectInfo y se mostrará lo siguiente:

groupId: io.eddumelendez.gradle artifactId: gradle-scripting-demo version: 1.0-SNAPSHOT

Si ejecutamos nuevamente gradle tasks, se puede visualizar una nuevo grupo Other tasks, donde figura la tarea que acabamos de crear. Cómo podemos asignarla a un grupo en particular? Haciendo uso de los atributos description y group.

task printProjectInfo
printProjectInfo.description = "Display info about the project" (1)
printProjectInfo.group = "Info" (2)
printProjectInfo << {
    println "groupId: ${project.group} artifactId: ${project.name} version: ${version}"
}
  1. Asignamos una descripción a la tarea printProjectInfo

  2. Asignamos la tarea printProjectInfo al grupo Info

Ejecutando gradle tasks una vez más, ahora vemos la tarea printProjectInfo como parte del grupo Info tasks.

En el siguiente código, agregaremos bloques de ejecución al inicio y al final de la tarea respectivamente.

task printProjectInfo
printProjectInfo.description = "Display info about the project"
printProjectInfo.group = "Info"
printProjectInfo << {
    println "groupId: ${project.group} artifactId: ${project.name} version: ${version}"
}

printProjectInfo.doFirst { println "Init printProjectInfo" } (1)
printProjectInfo.doLast { println "End printProjectInfo" } (2)
  1. Agregando bloque de ejecución al inicio de la tarea

  2. Agregando bloque de ejecución al final de la tarea

Ejecutando nuevamente gradle printProjectInfo en nuestro terminal, se visualizará la siguiente salida:

Init printProjectInfo
groupId: io.eddumelendez.gradle artifactId: gradle-scripting-demo version: 1.0-SNAPSHOT
End printProjectInfo

Otra forma de crear una tarea, es declarar la tarea y asignar el bloque como vemos a continuación:

task printProjectInfo << {
    println "groupId: ${project.group} artifactId: ${project.name} version: ${version}"
}

printProjectInfo.description = "Display info about the project"
printProjectInfo.group = "Info"

printProjectInfo.doFirst { println "Init printProjectInfo" }
printProjectInfo.doLast { println "End printProjectInfo" }

Una última forma de declarar la tarea es la siguiente:

task printProjectInfo(group: "Info", description: "Display info about the project") {
    println "groupId: ${project.group} artifactId: ${project.name} version: ${version}"
}

Haciendo uso del poder de Groovy estamos asignando valores a description y group que son atributos de org.gradle.api.DefaultTask heredados de org.gradle.api.internal.AbstractTask.

Para finalizar, dentro de nuestro build.gradle creamos la clase VersionVerifier con un método que valide si la versión del proyecto termina con .RELEASE, luego imprimimos el resultado en la consola.

task printProjectInfo(group: "Info", description: "Display info about the project") {
    println "Is releaseVersion? " + new VersionVerifier(version: version).isReleaseVersion()
}

class VersionVerifier {

  String version

  def isReleaseVersion() {
      version.endsWith(".RELEASE")
  }

}

Como se puede apreciar en el último ejemplo, podemos hacer uso de clases y métodos dentro de nuestro build y sacar provecho de lo ofrecido por groovy y gradle. Eso quiere decir, que podemos programar lo que sea dentro de nuestro build de una manera legible para todos.


Eddú Meléndez

Java Software Engineer, Open Source Contributor