2011-07-16 10 views
13

¿Hay alguna forma de agrupar objetivos en Phing? Tengo una serie de objetivos que se pueden reutilizar ejecutándolos en diferentes órdenes y combinaciones. Por ejemplo, para crear una nueva construcción dev:¿Cómo agrupar objetivos en Phing?

$ phing clean 
$ phing prepare 
$ phing build 
$ phing runtests 

o para actualizar una versión dev de un acuerdo de recompra:

$ phing update 
$ phing runtests 

¿Hay una manera de agrupar estos objetivos para funcionar como un solo comando? Soy consciente de que se puede, por ejemplo, los objetivos de la cadena:

$ phing clean prepare build runtests 
$ phing update runtests 

Pero idealmente me gustaría ejecutar un comando como:

$ phing cleanbuild 

Esto iría en los cuatro objetivos. De esta forma, el archivo de compilación puede separarse en objetivos reutilizables. Crear un nuevo objetivo que haga esto dará lugar a la duplicación del código de los objetivos existentes. Sé que puede usar el parámetro depends para ejecutar otros objetivos, pero quiero que cada objetivo sea independiente el uno del otro.

La documentación de Phing no parece ser muy clara sobre cómo hacer esto, pero estoy seguro de que es posible llamar a los objetivos dentro de otros objetivos, ya que debe ser una forma bastante común de hacer las cosas. Muchas gracias.

+0

Estoy muy interesado en ver el resultado de esta pregunta como estoy buscando un usando Phing mismo para automatizar migraciones de bases de datos, etc. – martynthewolf

Respuesta

25

OK, después de buscar un poco encontré la respuesta. Puede llamar a destinos desde otros objetivos utilizando la tarea PhingCallTask. Un ejemplo de una tarea compuesta:

<target name="cleanbuild" description="Runs a clean dev build"> 
    <phingcall target="clean" /> 
    <phingcall target="prepare" /> 
    <phingcall target="build" /> 
    <phingcall target="runtests" /> 
</target> 

La documentación está aquí:

http://www.phing.info/docs/guide/stable/apbs25.html

+6

Una cosa a tener en cuenta desde el documentación: nota importante sobre el alcance: cada etiqueta crea un nuevo ámbito local. Por lo tanto, cualquier propiedad u otras variables establecidas dentro de ese alcance dejarán de existir (o volverán a su valor anterior) una vez que se complete la etiqueta . – gabrielk

14

Su propia respuesta está muy bien. O puede utilizar el atributo depends y que sea aún más corto:

<target name="cleanbuild" description="Runs a clean dev build" depends="clean, prepare, build, runtests"></target> 
+0

Esa es una forma interesante de hacerlo, pero no es muy legible y podría parecer muy complicado si comienzas a agregar más objetivos. Sin embargo, es una buena opción para pequeños objetivos compuestos. Aclamaciones. –

+7

Acepto la legibilidad. Una ventaja de la dependencia es que si alguno de los objetivos depende de otro objetivo si se llama por separado, no se llamará a los objetivos dependientes dos veces. Digamos que desea llamar a las pruebas de ejecución por separado. Si siempre depende de 'prepare', usar en las pruebas de ejecución daría como resultado que el objetivo de 'preparación' se llame 2x cuando se ejecute cleanbuild. Si usa 'depends' se llama solo una vez por invocación de phing. – poisson

+1

Me encontré con una situación en la que este enfoque tenía mucho sentido sobre mi respuesta. Muy útil para evitar ejecutar tareas varias veces. –