Вы можете import
файл и использовать макрос следующим образом:
<import file="macrodefs.xml" />
<do-cool-stuff message="Hello, World!" />
Обратите внимание, что в определении макроса вы должны использовать @{curlybrackets}
при ссылке на атрибуты макроса:
<sequential>
<echo message="@{message}" />
</sequential>
В конце муравья есть несколько примеров macrodef
задача документы.
Подробнее
Чтовы пытаетесь сделать, не очень хорошо поддерживается Ant.Задачи ant
и antcall
не позволяют вызываемому объекту напрямую влиять на вызывающего.Вы можете записывать файлы в вызываемую задачу, а затем загружать их в вызывающую программу.Но, как вы заметили, задачи предварительной обработки import
и include
не могут быть вызваны изнутри цели.Задачи ant / antcall позволяют вам запускать цели только во вспомогательных сборках, а не в макросах.
Один обходной метод (он может быть похож на тот, который вы упомянули, но позволяет поместить всю реальную работу в топ-level build) будет иметь внутренний buildfile, который включает в себя импорт верхнего уровня из macrodefs.xml.
Что-то вроде следующего.Файл macrodefs.xml такой же, как и раньше.(Но обратите внимание, что импортированные файлы - включая определения макросов - должны быть полными файлами проекта Ant, поэтому они должны включать элемент проекта.)
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>
Эффективно вы будете делать
build.xml --> inner-build.xml --> build.xml (again)
(cvs) (import macros) (use macros)
Внутренний файл сборки может потенциально генерироваться на лету основной сборкой - скажем, если вы хотитеимпортировать несколько файлов определений макросов, но это становится слишком громоздким.