Cuando trabajamos con tareas en Gradle, a menudo necesitamos controlar cuándo se ejecutan, asegurándonos de que solo lo hagan si se cumplen ciertas condiciones. Esto nos ayuda a evitar ejecuciones innecesarias o erróneas, como intentar distribuir un proyecto que aún no ha sido compilado. Para lograr esto, Gradle nos ofrece el método onlyIf, que nos permite definir condiciones bajo las cuales una tarea debe ejecutarse.
Para ilustrar esto, podemos crear dos tareas simples: una llamada compilar y otra llamada distribuir. En la tarea compilar, añadimos un bloque doLast que simplemente imprime compilando el proyecto. De manera similar, en la tarea distribuir, el bloque doLast imprime distribuyendo mi proyecto.
task compilar {
doLast {
println 'compilando el proyecto'
}
}
task distribuir {
doLast {
println 'distribuyendo mi proyecto'
}
}
Si ejecutamos la tarea distribuir directamente, veremos que imprime el mensaje de distribución, aunque no tenga sentido hacerlo sin haber compilado antes. Para evitar esto, normalmente usamos dependsOn para establecer que distribuir depende de compilar. Así, al ejecutar distribuir, Gradle se asegura de ejecutar primero compilar.
distribuir.dependsOn compilar
Sin embargo, existe otro enfoque que nos permite condicionar la ejecución de una tarea basándonos en una condición que puede evaluarse en tiempo de ejecución. Aquí es donde entra en juego onlyIf. Este método acepta un cierre (closure) que debe devolver un valor booleano. Si devuelve true, la tarea se ejecuta; si devuelve false, la tarea se omite.
Por ejemplo, podemos hacer que la tarea distribuir solo se ejecute si la tarea compilar realmente hizo algún trabajo. Para ello, usamos la propiedad didWork de la tarea compilar, que indica si la tarea se ejecutó y realizó alguna acción.
distribuir.onlyIf {
compilar.didWork
}
Con esta configuración, si ejecutamos gradle -q distribuir sin haber ejecutado antes compilar, la tarea distribuir no hará nada porque compilar.didWork será false. En cambio, si ejecutamos primero gradle -q compilar distribuir, la tarea compilar se ejecutará, y luego distribuir también, ya que la condición en onlyIf será verdadera.
Pero onlyIf no se limita a verificar el estado de otras tareas. Podemos usar cualquier lógica que queramos, incluyendo código Java o Groovy, para decidir si una tarea debe ejecutarse. Por ejemplo, podemos condicionar la ejecución de distribuir a la existencia de un archivo específico, como configuración.xml.
distribuir.onlyIf {
new File('configuración.xml').exists()
}
Con esta condición, si el archivo configuración.xml no existe, la tarea distribuir no se ejecutará. Si creamos el archivo (por ejemplo, usando touch configuración.xml en la terminal) y luego ejecutamos gradle -q distribuir, la tarea sí se ejecutará y mostrará el mensaje correspondiente.
Este mecanismo nos brinda una gran flexibilidad para controlar la ejecución de tareas en Gradle, permitiéndonos definir condiciones precisas y complejas que se adapten a las necesidades de nuestro proyecto. Podemos combinar dependsOn y onlyIf para gestionar dependencias y condiciones, asegurando que las tareas se ejecuten en el orden correcto y solo cuando sea necesario.