Sigamos explorando las tareas que Gradle nos ofrece para facilitar la automatización de procesos en nuestros proyectos. Después de haber trabajado con la tarea copy, ahora nos centramos en la tarea exec, que nos permite ejecutar comandos externos de forma sencilla y multiplataforma.
La tarea exec es muy versátil y funciona tanto en sistemas Unix como en Windows sin necesidad de hacer ajustes específicos para cada plataforma. Esto significa que podemos ejecutar scripts .sh en Unix o comandos propios de Windows con la misma configuración en Gradle, lo que simplifica mucho la gestión de tareas en proyectos que deben funcionar en distintos entornos.
Para definir una tarea de tipo exec, simplemente creamos una tarea y especificamos la propiedad commandLine, que es donde indicamos el comando que queremos ejecutar junto con sus argumentos. Es importante tener en cuenta que cada argumento debe ir separado por comas y entre comillas para que Gradle lo interprete correctamente.
Por ejemplo, si queremos listar el contenido del directorio dist de forma recursiva y detallada usando el comando ls -lr, la configuración sería así:
task ejecutar(type: Exec) {
commandLine 'ls', '-lr', 'dist'
}
Al ejecutar esta tarea, el resultado del comando se mostrará directamente en la consola, ya que por defecto la salida estándar del proceso se redirige a la terminal. Esto es útil para ver rápidamente la información generada por el comando.
Sin embargo, podemos personalizar esta salida estándar para que, en lugar de mostrarse en pantalla, se escriba en un archivo. Para ello, utilizamos la propiedad standardOutput y le asignamos un OutputStream que apunte al archivo donde queremos guardar la salida. Por ejemplo:
task ejecutar(type: Exec) {
commandLine 'ls', '-lr', 'dist'
standardOutput = new FileOutputStream('dist/salida')
}
Con esta configuración, al ejecutar la tarea, no veremos nada en la consola, pero el resultado del comando quedará almacenado en el archivo dist/salida. Esto es especialmente útil cuando queremos procesar o revisar la salida más adelante sin saturar la terminal.
Además de controlar la salida, también podemos definir la entrada estándar del proceso con la propiedad standardInput. Esto nos permite enviar datos al comando que estamos ejecutando, por ejemplo, si queremos pasar el contenido de un archivo o de otra fuente como entrada. Aunque en el ejemplo no se probó, la idea es que podríamos hacer algo así:
task ejecutar(type: Exec) {
commandLine 'cat'
standardInput = new FileInputStream('archivo_entrada.txt')
}
En este caso, el comando cat recibiría como entrada el contenido del archivo archivo_entrada.txt. Esto abre muchas posibilidades para automatizar procesos que requieren interacción con datos de entrada.
Por último, es importante destacar que la tarea exec ofrece muchas más opciones para personalizar la ejecución, como definir variables de entorno, obtener el resultado de la ejecución, configurar el directorio de trabajo, entre otras. Toda esta información está disponible en la documentación oficial de Gradle, pero con lo que hemos visto ya podemos crear tareas ejecutables muy funcionales y adaptadas a nuestras necesidades.
Así, con la tarea exec podemos integrar comandos externos en nuestro flujo de trabajo de Gradle, controlar su entrada y salida, y mantener la portabilidad entre sistemas operativos, lo que nos ayuda a automatizar y simplificar muchas tareas en nuestros proyectos.