Может ли задача макроопределения вызываться динамически - PullRequest
4 голосов
/ 18 июля 2011

У меня есть несколько задач macrodef, которые я хотел бы вызвать, но хотел бы обернуть вызовы некоторым временным кодом. Это может быть легко сделано, если задачи были целевыми, а не макроопределениями, с помощью antcall.

Можно ли сделать то же самое с macrodef?

Пример:
Строка"macrocall" - это гипотетическая задача, которую я хотел бы использовать (сродни "antcall")

<target name="run.tests">
    <run.named.test name="macro1" />
    <run.named.test name="macro2" />
</target>

<macrodef name="run.named.test">
    <attribute name="name" />
    <sequential>
        <echoTime />
        <macrocall name="@{name}" />
        <echoTime />
    </sequential>
</macrodef>

<macrodef name="macro1">
</macrodef>

<macrodef name="macro2">
</macrodef>

Ответы [ 3 ]

0 голосов
/ 08 мая 2014

Это очень поздний ответ, но я некоторое время боролся с точно такой же проблемой и только сейчас придумал решение, поэтому я решил внести свой вклад.

Прежде всего, я думаю, что можно с уверенностью сказать, что нет никакого способа сделать это просто с помощью Ant, кроме как сделать что-то чрезвычайно хакерское, например, вывести код Ant в новый файл и затем вызвать макрос из файла.

В любом случае, я решил использовать задачу Groovy Ant для запуска кода на Groovy. Вот что я придумал:

<groovy>
    ant."${properties["macrodef.name"]}"("dir":properties["dir"])
</groovy>

Объяснение:

- ant. - это просто префикс для указания Groovy запустить задачу Ant. Например, ant.echo() запускает задачу <echo>.

- "${properties["macrodef.name"]}" извлекает свойство с именем "macrodef.name" из моего проекта Ant.

-При двух вышеупомянутых комбинациях, объединенных вот так, я говорю Groovy запустить задачу Ant с тем же именем, что и у свойства «macrodef.name». Например, если ${macrodef.name} в моем проекте Ant в настоящее время содержит значение «compile», Groovy будет читать эту строку как ant.compile.

- ("dir":properties["dir"]) говорит Groovy запустить macrodef с атрибутом "dir", используя значение свойства Ant, также называемого "dir". Чтобы быть понятным, это потому, что мой макрос определяет этот атрибут. В Ant это будет выглядеть так: <compile dir="${dir}" />

Надеюсь, это поможет любому, кто сталкивается с этим! Для справки, я хотел избежать использования более общей задачи <script>, потому что, очевидно, она выполняется заметно медленнее, чем базовая задача Ant или Groovy. Идеальным решением, вероятно, было бы на самом деле написать пользовательскую задачу Ant, но, к сожалению, мне пока не хватает знаний, чтобы сделать это.

0 голосов
/ 24 декабря 2015

Существует два способа динамического разрешения имени макроопределения

1) Имена Macrodef не являются постоянными и разрешаются во время загрузки в зависимости от переменной «что сказать». В результате только один макрос определяет имя «скажи что-то», а имя другого не разрешается (поэтому недоступно для вызова)

<property name="what-to-say" value="bye"/>

<property name="say-${what-to-say}" value="say-something"/>

<macrodef name="${say-hi}">
        <sequential>
            <echo>hi!</echo>
        </sequential>
</macrodef>
<macrodef name="${say-bye}">
        <sequential>
            <echo>bye!</echo>
        </sequential>
</macrodef>

<target name="test">
    <say-something/>
</target>

2) Создайте два дополнительных файла с определениями макросов, например,

<project name="macrodefs-hi.xml>
    <macrodef name="say-something">
            <sequential>
                <echo>hi!</echo>
            </sequential>
    </macrodef>
</project>
<project name="macrodefs-bye.xml>
    <macrodef name="say-something">
            <sequential>
                <echo>bye!</echo>
            </sequential>
    </macrodef>
</project>

И включите только один из них в ваш основной проект

<property name="what-to-say" value="bye"/>

<import file="macrodefs-${what-to-say}.xml"/>

<target name="test">
    <say-something/>
</target>
0 голосов
/ 27 февраля 2012

Почему бы не обернуть ваш macro1 macro2 с целями и использовать antcall для «macrocall».каждая новая цель macro1, macro2 будет выполняться в своем собственном проекте (свойства и ссылки передаются, но не возвращаются), что может или не может быть хорошей вещью в зависимости от того, чего вы пытаетесь достичь.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...