Есть ли способ обобщить цель Apache ANT?
У нас есть Apache ANT script для создания нашего приложения, а затем проверьте полученный JAR файл в контроле версий (в этом случае VSS). Однако теперь у нас есть изменение, которое требует от нас создания 2 файлов JAR для этого проекта, а затем проверить их как на VSS.
Текущая цель, которая проверяет исходный файл JAR в VSS, обнаруживает имя файла JAR через некоторое свойство. Есть ли простой способ "обобщить" эту цель, чтобы я мог повторно использовать ее для проверки в файле JAR с любым именем? На нормальном языке это, очевидно, вызовет параметр функции, но, насколько мне известно, в ANT действительно нет эквивалентной концепции.
Ответы
Ответ 1
Я предлагаю работать с макросами над subant/antcall, потому что основное преимущество, которое я нашел с помощью макросов, заключается в том, что вы полностью контролируете над свойствами, которые передаются макросу (особенно если вы хотите добавить новые свойства).
Вы просто реорганизуете свой Ant script, начиная с вашей цели:
<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>
Рефакторинг, "способ Ant"
Ответ 2
Обычно считается неправильной идеей для контроля версий ваших двоичных файлов, и я не рекомендую это делать. Но если вам абсолютно необходимо, вы можете использовать antcall в сочетании с параметром для передачи параметров и вызова цели.
<antcall target="reusable">
<param name="some.variable" value="var1"/>
</antcall>
<target name="reusable">
<!-- Do something with ${some.variable} -->
</target>
Более подробную информацию о antcall задайте здесь.
Ответ 3
Взгляните на макросы Ant . Они позволяют вам определять повторяющиеся "подпрограммы" для сборки Ant. Здесь вы можете найти пример (пункт 15).
Ответ 4
Также проверьте задачу 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>
Ответ 5
Вы можете использовать Gant для script свою сборку с groovy, чтобы сделать то, что вы хотите, или посмотрите на groovy ant task.