ant - Cómo invocar un macrodef desde otro archivo
build (1)
Escribí un pequeño macrodef en un archivo separado:
macrodefs.xml
<macrodef name="do-cool-stuff">
<attribute name="message"/>
<sequential>
<echo message="@{message}" />
</sequential>
</macrodef>
Obtuve un segundo archivo, mi archivo de compilación principal:
build.xml
<target name="build">
<!-- do this and that -->
<!-- cheking out macrodefs.xml via CVS -->
<ant antfile="macrodefs.xml" target="do-cool-stuff" >
<property name="message" value="Hello, World!" />
</ant>
</target>
Como puedes imaginar, esto no funciona. El mensaje de error es algo así como:
Target ''do-cool-stuff'' does not exist in this project.
La única solución posible que encontré es proporcionar un objetivo adicional en el macrodefs.xml para reenviar las llamadas hormiga.
¿Existe la posibilidad de invocar el macrodef desde otro archivo?
Gracias por adelantado.
Puede import
el archivo y usar la macro como esta:
<import file="macrodefs.xml" />
<do-cool-stuff message="Hello, World!" />
Tenga en cuenta que en la definición de macro debe usar @{curlybrackets}
al hacer referencia a los atributos de macro:
<sequential>
<echo message="@{message}" />
</sequential>
Hay algunos ejemplos al final de los documentos de la tarea macrodef
Ant.
Más
Lo que estás tratando de hacer no está bien respaldado por Ant. Las tareas antcall
y antcall
no permiten que el ''llamado'' afecte directamente a la persona que llama. Puede escribir archivos en la tarea llamada y luego cargarlos en la persona que llama. Pero como ha observado, las tareas previas al proceso import
e include
no se pueden llamar desde un destino. Las tareas Ant / Antcall solo le permiten ejecutar objetivos en versiones subsidiarias, no en macros.
Un método alternativo (esto podría ser similar al que usted menciona, pero le permite poner todo el trabajo real en la compilación de nivel superior) sería tener un archivo de compilación interno que incluya la importación de nivel superior de macrodefs.xml.
Algo como lo siguiente. El archivo macrodefs.xml es como antes. (Pero tenga en cuenta que los archivos importados, incluidas las definiciones de macro, deben ser archivos completos del proyecto Ant, por lo que deben incluir un elemento de proyecto).
build.xml:
<target name="build">
<!-- cvs actions -->
<ant antfile="inner-build.xml" target="target-runner">
<property name="target" value="top-target" />
</ant>
</target>
<!-- this target will fail unless invoked from the inner build -->
<target name="top-target">
<do-cool-stuff message="Hello, World!" />
</target>
inner-build.xml:
<project>
<import file="macrodefs.xml" />
<target name="target-runner">
<ant antfile="build.xml" target="${target}" />
</target>
</project>
Efectivamente estarías haciendo
build.xml --> inner-build.xml --> build.xml (again)
(cvs) (import macros) (use macros)
El buildfile interno podría ser generado sobre la marcha por la compilación principal, digamos si quería importar múltiples archivos de definición de macros, pero eso quizás sea demasiado difícil de manejar.