Вопрос

У нас есть скрипт 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 здесь.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top