Есть ли способ обобщить цель Apache ANT?
-
09-06-2019 - |
Вопрос
У нас есть скрипт Apache ANT для сборки нашего приложения, затем мы загружаем полученный файл JAR в систему управления версиями (в данном случае VSS).Однако теперь у нас есть изменение, которое требует от нас создания 2 файлов JAR для этого проекта, затем проверки обоих в VSS.
Текущий целевой объект, который проверяет исходный файл JAR в VSS, обнаруживает имя файла JAR через некоторое свойство.Есть ли простой способ "обобщить" эту цель, чтобы я мог повторно использовать ее для проверки в файле JAR с любым именем?На обычном языке это, очевидно, потребовало бы параметра функции, но, насколько мне известно, в ANT действительно нет эквивалентного понятия.
Решение
Я бы предложил поработать с макросы вместо subant / antcall, потому что главное преимущество, которое я обнаружил с помощью макросов, заключается в том, что вы полностью контролируете свойства, которые передаются макросу (особенно если вы хотите добавить новые свойства).
Вы просто рефакторируете свой Ant-скрипт, начиная с вашей цели:
<target name="vss.check">
<vssadd localpath="D:\build\build.00012.zip"
comment="Added by automatic build"/>
</target>
создание макроса (обратите внимание на копирование / вставку и замену с помощью @{file}):
<macrodef name="private-vssadd">
<attribute name="file"/>
<sequential>
<vssadd localpath="@{file}"
comment="Added by automatic build"/>
</sequential>
</macrodef>
и вызывайте макросы с вашими файлами:
<target name="vss.check">
<private-vssadd file="D:\build\File1.zip"/>
<private-vssadd file="D:\build\File2.zip"/>
</target>
Рефакторинг, "муравьиный путь"
Другие советы
Обычно считается плохой идеей контролировать версии ваших двоичных файлов, и я не рекомендую этого делать.Но если вам абсолютно необходимо, вы можете использовать antcall в сочетании с param для передачи параметров и вызова целевого объекта.
<antcall target="reusable">
<param name="some.variable" value="var1"/>
</antcall>
<target name="reusable">
<!-- Do something with ${some.variable} -->
</target>
Вы можете найти более подробную информацию о задача antcall здесь.
Также ознакомьтесь с задачей subant, которая позволяет вызывать одну и ту же цель в нескольких файлах сборки:
<project name="subant" default="subant1">
<property name="build.dir" value="subant.build"/>
<target name="subant1">
<subant target="">
<property name="build.dir" value="subant1.build"/>
<property name="not.overloaded" value="not.overloaded"/>
<fileset dir="." includes="*/build.xml"/>
</subant>
</target>
</project>
Вы можете использовать Gant чтобы написать сценарий вашей сборки с помощью заводной делать то, что вы хотите, или взглянуть на заводная муравьиная задача.