Как вызвать macrodef из другого файла - PullRequest
8 голосов
/ 18 февраля 2011

Я написал небольшой макрос в отдельном файле:

macrodefs.xml

<macrodef name="do-cool-stuff">
  <attribute name="message"/>

  <sequential>
    <echo message="@{message}" />
  </sequential>
</macrodef>

Я получил второй файл, мой основной файл сборки:

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>

Как вы могли догадаться, это не работает. Сообщение об ошибке выглядит примерно так:

Target 'do-cool-stuff' does not exist in this project.

Единственное возможное решение, которое я нашел, - предоставить дополнительную цель в файле macrodefs.xml для переадресации вызовов ant.

Есть ли возможность вызвать macrodef из другого файла?

Заранее спасибо.

1 Ответ

16 голосов
/ 18 февраля 2011

Вы можете 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)

Внутренний файл сборки может потенциально генерироваться на лету основной сборкой - скажем, если вы хотитеимпортировать несколько файлов определений макросов, но это становится слишком громоздким.

...