Las tareas en Gradle son mucho más que simples comandos que ejecutan código; son objetos con propiedades y comportamientos que podemos definir y manipular para adaptar su ejecución a nuestras necesidades. Cuando creamos una tarea, no solo le asignamos un nombre y un bloque de código, sino que podemos establecer variables internas que actúan como parámetros configurables, y también definir acciones específicas que se ejecutan en momentos determinados durante la vida de la tarea.
Para empezar, dentro de una tarea podemos declarar propiedades usando el objeto especial ext. Este objeto nos permite definir variables que quedan expuestas y accesibles desde otras tareas o desde el propio script de Gradle. Por ejemplo, podemos guardar el nombre del autor, el correo electrónico, la versión del proyecto o cualquier otro dato que queramos parametrizar y que pueda influir en el comportamiento de la tarea. Así, si definimos una tarea llamada olamundo con propiedades como nombre, correo y version, luego podemos acceder a ellas desde otra tarea simplemente referenciando olamundo.nombre, olamundo.correo, etc.
task olamundo {
ext {
nombre = 'Pepito'
correo = 'pepito@pepito.com'
version = '1.0'
}
}
Luego, en otra tarea, podemos usar esas propiedades para personalizar la salida o la lógica:
task compilar {
doLast {
println "Compilando proyecto ${olamundo.nombre} ${olamundo.version}. Si hay problemas, avisad a ${olamundo.correo}."
}
}
Además, si solo queremos definir una propiedad sin necesidad de agrupar muchas, podemos usar una forma más sencilla asignando directamente a ext:
task olamundo {
ext.nombre = 'Pepito'
ext.correo = 'pepito@pepito.com'
ext.version = '1.0'
}
En cuanto a los comportamientos, la tarea puede ejecutar código en distintos momentos. El más común es doLast, que define una acción que se ejecuta al final de la tarea. Dentro de este bloque podemos escribir cualquier código Groovy o Java que necesitemos. Por ejemplo:
task holamundo {
ext.proyecto = 'Mi Proyecto 1.0'
doLast {
println "Compilando proyecto ${proyecto}"
}
}
Al ejecutar esta tarea, veremos el mensaje con el nombre del proyecto. También existe una forma abreviada para definir el comportamiento doLast usando el operador <<:
task compilar << {
println "Compilando proyecto ${proyecto}"
}
Esto es equivalente a usar doLast, pero más conciso. Además, podemos definir el comportamiento fuera del bloque de la tarea, accediendo directamente a la tarea por su nombre y añadiendo el bloque doLast:
task holamundo
holamundo.doLast {
println "Ejecutando tarea holamundo con proyecto ${holamundo.proyecto}"
}
Esta flexibilidad nos permite organizar el código de la forma que mejor se adapte a nuestro proyecto.
Por último, dentro de las tareas podemos usar código Groovy o Java sin restricciones. Podemos declarar variables de cualquier tipo, como cadenas o fechas, y usarlas para enriquecer la lógica de la tarea. Por ejemplo:
task holamundo {
ext.proyecto = 'Hola Mundo'
def ahora = new Date()
doLast {
println "Compilando proyecto ${proyecto} a las ${ahora.toString()}"
}
}
Al ejecutar esta tarea, veremos un mensaje que incluye la fecha y hora actuales, demostrando que podemos integrar código Java directamente en nuestras tareas Gradle.
En definitiva, las tareas en Gradle son objetos potentes que combinan propiedades configurables y comportamientos ejecutables, y podemos definirlos de múltiples maneras para adaptarlos a nuestras necesidades. Además de doLast, existen otros comportamientos como doFirst y muchas más propiedades que podemos explorar para sacarle el máximo partido a la automatización de nuestros proyectos.