Условно удалить в Ant - PullRequest
       15

Условно удалить в Ant

5 голосов
/ 02 мая 2010

Я хочу удалить каталог, если для свойства "delete-compiled-dir" установлено значение true. Если свойство имеет значение false, не выполняйте его. Прямо сейчас у меня есть

<target name="deleted-after-compilation" depends="compile,jar">
        <condition property="${delete-compiled-dir}" value="true">
            <delete dir="${compilation-dir}" />
        </condition>
            <echo> Deleting Compiled Directory Classes </echo>
    </target>

Я получаю сообщение об ошибке:

condition doesn't support the nested "delete" element.

Ответы [ 4 ]

4 голосов
/ 02 мая 2010

Вы можете добавить условие к своей цели, используя if (см. руководство ).

Цель будет выполнена, только если установлено свойство compilation-dir (любое значение, например, false).

<target name="deleted-after-compilation" depends="compile,jar"
        if="${compilation-dir}">
    <delete dir="${compilation-dir}" />
    <echo> Deleting Compiled Directory Classes </echo>
</target>

Чтобы выполнить его только в том случае, если для свойства установлено значение true, сначала нужно установить другое свойство и проверить это в if. Вы можете добавить оба в качестве зависимости другую цель:

<target name="set-delete-property">
    <condition property="delete-compilation-dir">
        <istrue value="${compilation-dir}"/>
    </condition>
</target>

<target name="deleted-after-compilation"
      depends="compile,jar" if="${compilation-dir}">
    ....

<target name="some-target"
      depends="set-delete-property,deleted-after-compilation">
</target>
2 голосов
/ 28 июня 2014

Есть несколько способов сделать это:

Использование условий на целевом объекте

Цели могут содержать if и unless условий. Цель будет выполняться в зависимости от того, установлено свойство или нет. (Не установлено на true , просто установлено). Это обычный способ узнать, нужно ли вам что-то делать или нет:

<target name="deleted.after.compilation" 
    if="delete.compiled.dir"
    depends="jar">
        <delete dir="${compilation-dir}" />
        <echo> Deleting Compiled Directory Classes </echo>
</target>

Вы можете установить свойство в командной строке:

$ ant -Ddelete.compiled.dir all

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

Используйте условные предложения Ant 1.9.1

Начиная с Ant 1.9.1, Ant имеет условных атрибутов , которые можно добавлять к задачам. Вам необходимо добавить объявление пространства имен в вашу <project> сущность:

<project ... 
    xmlns:if="ant:if"
    xmlns:unless="ant:unless">

    <target name="deleted.after.compilation" 
        depends="jar">
        <delete dir="${compilation-dir}" if:true="${delete.compiled.dir}"/>
        <echo if:true="${delete.compiled.dir}"> Deleting Compiled Directory Classes </echo>
    </target>

Используйте Ant-Contrib's If Statement

Ха-ха, эта дурацкая библиотека Ant-Contrib. Никто не знает, кто его поддерживает, и его не трогали годами, но многие люди так сильно зависят от него.

<project ...>
    <taskdef resource="net/sf/antcontrib/antlib.xml">
        <classpath>
            <fileset dir="${ivy.dir}/antcontrib">
                <include name="ant-contrib*.jar"/>
            </fileset>
        </classpath>
    </taskdef>

    <target name="deleted.after.compilation" 
        depends="jar">
        <if>
            <istrue value="${delete.compiled.dir}"/>
            <then>
                <delete dir="${compilation-dir}"/>
                <echo>Deleting Compiled Directory Classes </echo>
            </then?
        </if>
    </target>

Вы можете понять, почему Ant-Contrib популярен. В нем много силы, и мы все это знаем. Кроме того, если кто-то еще использует Ant 1.8 или 1.7, это все равно будет работать.

0 голосов
/ 28 июня 2014

Начиная с Ant 1.9.1, вы можете использовать условные выражения для любой задачи. Описано здесь .

Добавьте это пространство имен к элементу вашего проекта:

<project name="yourproject" xmlns:if="ant:if">

Затем добавьте это к вашему удалению:

<delete dir="${compilation-dir}" if:true="${delete-compiled-dir}"/>
0 голосов
/ 12 марта 2014

если у вас есть свойство, вы можете просто использовать его в качестве цели.

<target name="delete" if="${delete-compiled-dir}">
    <delete dir="${compilation-dir}" />
</target>
...