A blog about data, information and Tech by Mario Alberich

        

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.

© 2007 and beyond Mario Alberich, licensed under CC-BY-SA unless stated otherwise.