Это очень поздний ответ, но я некоторое время боролся с точно такой же проблемой и только сейчас придумал решение, поэтому я решил внести свой вклад.
Прежде всего, я думаю, что можно с уверенностью сказать, что нет никакого способа сделать это просто с помощью 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, но, к сожалению, мне пока не хватает знаний, чтобы сделать это.