Есть ли способ обобщить цель Apache ANT? - PullRequest
19 голосов
/ 08 сентября 2008

У нас есть скрипт Apache ANT, чтобы построить наше приложение, а затем включить полученный JAR-файл в систему управления версиями (в данном случае VSS). Однако теперь у нас есть изменение, которое требует, чтобы мы собрали 2 файла JAR для этого проекта, а затем зарегистрировали оба в VSS.

Текущая цель, которая проверяет исходный файл JAR в VSS, обнаруживает имя файла JAR через некоторое свойство. Есть ли простой способ «обобщить» эту цель, чтобы я мог повторно использовать ее для регистрации в файле JAR с любым именем? На нормальном языке это, очевидно, потребовало бы параметра функции, но, насколько мне известно, в ANT действительно нет эквивалентной концепции.

Ответы [ 5 ]

46 голосов
/ 15 сентября 2008

Я бы предложил работать с макросами над 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>

Рефакторинг, "Муравейник"

21 голосов
/ 08 сентября 2008

Обычно считается плохой идеей для контроля версий ваших двоичных файлов, и я не рекомендую делать это. Но если вам абсолютно необходимо, вы можете использовать antcall в сочетании с param для передачи параметров и вызова цели.

<antcall target="reusable">
    <param name="some.variable" value="var1"/>
</antcall>

<target name="reusable">
    <!-- Do something with ${some.variable} -->
</target>

Более подробную информацию о задаче antcall вы можете найти здесь .

5 голосов
/ 08 сентября 2008

Взгляните на муравьи макросы . Они позволяют вам определять повторно используемые «подпрограммы» для сборок Ant. Вы можете найти пример здесь (позиция 15).

3 голосов
/ 08 сентября 2008

Также проверьте вспомогательную задачу, которая позволяет вам вызывать одну и ту же цель для нескольких файлов сборки:

<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>
1 голос
/ 18 сентября 2008

Вы можете использовать Gant для сценария сборки с groovy , чтобы делать то, что вы хотите, или взглянуть на groovy ant task .

...