Phing (VI) - Llamadas entre tareas
Encapsular grupos de tareas
Es posible que a medida que se utiliza Phing, veamos que los
targets generados sean reutilizables. Lógico, al fin y al cabo estamos utilizando Phing para automatizar tareas repetitivas. Pero la estructura del archivo build.xml empieza a ser excesiva, o bien los targets son muy extensos. A pesar de la utilidad, el XML no es el formato al que está acostumbrado un programador: el mantenimiento se dificulta y los problemas ofuscan la utilidad inicial.</p>
Para eso Phing incluye algunas tareas que permiten separar los archivos de proyectos, para luego llamarlos con diversos métodos. Aquí comento tres métodos, que tienen diferencias de matiz, pero puedes utilizar sin grandes diferencias.
phing
Esta llamada permite hacer operaciones como la siguiente:
Carga el archivo limpiar_codigo.xml, ejecuta el
target quitaespacios. Esta operación, sin más, permite tener un conjunto de
targets para limpiar el código (convertir tabuladores en espacios, eliminar saltos de carro \r, cambiar el juego de caracteres), otra para auditar el código, y así hasta donde se considere oportuno.
En algunos de estos casos se deseará compartir el contexto de ejecución, para así utilizar las propiedades inicializadas en el target padre. Para estos casos, se puede añadir el argumento inheritAll y asignarle el valor "true":
Pero, como en otras tareas de Phing, también es posible enviar valores de propiedades nuevas, así:
En este caso suponemos que el target
quitaespacios tiene la opción de convertir los tabuladores en 4 espacios.
phingcall
Casi idéntico a phing, pero... para el proyecto actual. Es decir, phingcall se encarga de llamar a subrutinas, utilizadas en otros
targets del mismo proyecto (o bien, utilizando la anterior tarea
phing, llamable desde otros proyectos).
En este caso, el único parámetro es target. Y como en el caso de la tarea phing puede enviar propiedades a la tarea llamada:
La anterior llamada podría estar situada dentro del archivo
limpiar_codigo.xml, y ser llamada, por ejemplo, desde el target
quitaespacios.
import
Este caso es un intermedio: permite guardar los
targets en otro archivo, pero no se realiza una llamada externa, porque en realidad los
targets se están importando y se pueden ejecutar como si estuvieran en el mismo archivo.
Puede suceder que los dos archivos XML incluyan un target con el mismo nombre. En ese caso, el target del archivo principal (el que realiza el
import) tiene precedencia. Sin embargo, se puede llamar al target del archivo importado utilizando el nombre
proyecto.target.
Por ejemplo, si limpiar_codigo.xml tiene como nombre de proyecto "limpiar_codigo", incluye la tarea tabtospaces, y el proyecto principal también tiene ese mismo nombre de tarea, puedes llamar a la tarea hija con una phingcall cuyo atributo target sea limpiar_codigo.tabtospaces.
Otro detalle clave en las importaciones es que un target importado utilizará las variables de entorno de su nuevo contexto de ejecución. Por ejemplo, su ruta será la del proyecto padre, y las rutas relativas (por ejemplo para cargar archivos de propiedades) también tendrán ese comportamiento.