Подтвердить что ты не робот

Ant если условие else?

Есть ли условие if else, которое я могу использовать для задачи Ant?

Это то, что я написал до сих пор:

<target name="prepare-copy" description="copy file based on condition">
        <echo>Get file based on condition</echo>
    <copy file="${some.dir}/true" todir="."  if="true"/>
</target>

script выше скопирует файл, если условие истинно. Что делать, если условие ложно, и я хочу скопировать другой файл? Возможно ли это в Ant?

Я мог бы передать параметр в вышеуказанную задачу и убедиться, что переданный параметр

4b9b3361

Ответ 1

Атрибут if не существует для <copy>. Он должен применяться к <target>.

Ниже приведен пример того, как вы можете использовать атрибут depends целевого объекта и атрибуты if и unless для управления выполнением зависимых целей, Только один из них должен выполнить.

<target name="prepare-copy" description="copy file based on condition"
    depends="prepare-copy-true, prepare-copy-false">
</target>

<target name="prepare-copy-true" description="copy file based on condition"
    if="copy-condition">
    <echo>Get file based on condition being true</echo>
    <copy file="${some.dir}/true" todir="." />
</target>

<target name="prepare-copy-false" description="copy file based on false condition" 
    unless="copy-condition">
    <echo>Get file based on condition being false</echo>
    <copy file="${some.dir}/false" todir="." />
</target>

Если вы используете ANT 1.8+, вы можете использовать расширение свойства, и он будет оценивать значение свойства для определения логического значения. Таким образом, вы можете использовать if="${copy-condition}" вместо if="copy-condition".

В ANT 1.7.1 и ранее вы указываете имя свойства. Если свойство определено и имеет любое значение (даже пустую строку), то оно будет оцениваться как true.

Ответ 2

Вы также можете сделать это с помощью ant Contrib if task.

<if>
    <equals arg1="${condition}" arg2="true"/>
    <then>
        <copy file="${some.dir}/file" todir="${another.dir}"/>
    </then>
    <elseif>
        <equals arg1="${condition}" arg2="false"/>
        <then>
            <copy file="${some.dir}/differentFile" todir="${another.dir}"/>
        </then>
    </elseif>
    <else>
        <echo message="Condition was neither true nor false"/>
    </else>
</if>

Ответ 3

Причудливый синтаксис с использованием условий на целевой (описанный Mads) является единственным поддерживаемым способом выполнения условного выполнения в ядре ANT.

ANT не является языком программирования, и когда все усложняется, я решил вставить script в мою сборку следующим образом:

<target name="prepare-copy" description="copy file based on condition">
    <groovy>
        if (properties["some.condition"] == "true") {
            ant.copy(file:"${properties["some.dir"]}/true", todir:".")
        }
    </groovy>
</target>

ANT поддерживает несколько языков (см. script), я предпочитаю Groovy из-за этого краткий синтаксис и потому, что он так хорошо работает со сборкой.

Извинения, Дэвид, я не поклонник ant-contrib.

Ответ 5

<project name="Build" basedir="." default="clean">
    <property name="default.build.type" value ="Release"/>

    <target name="clean">
    <echo>Value Buld is now  ${PARAM_BUILD_TYPE} is set</echo>
        <condition property="build.type" value="${PARAM_BUILD_TYPE}" else="${default.build.type}">
            <isset property="PARAM_BUILD_TYPE"/>
        </condition>

       <echo>Value Buld is now  ${PARAM_BUILD_TYPE} is set</echo>
       <echo>Value Buld is now  ${build.type} is set</echo>
    </target>
</project>

В моем случае DPARAM_BUILD_TYPE=Debug, если он поставлен, чем, мне нужно построить для Debug, иначе мне нужно идти на сборку сборки релиза. Я пишу, как выше условие, которое это сработало, и я протестировал, как показано ниже, он отлично работает для меня.

И свойство ${build.type} мы можем передать это другому целевому или макродефту для обработки, который я делаю в моем другом ant macrodef.

D:\>ant -DPARAM_BUILD_TYPE=Debug
Buildfile: D:\build.xml
clean:
     [echo] Value Buld is now  Debug is set
     [echo] Value Buld is now  Debug is set
     [echo] Value Buld is now  Debug is set
main:
BUILD SUCCESSFUL
Total time: 0 seconds
D:\>ant
Buildfile: D:\build.xml
clean:
     [echo] Value Buld is now  ${PARAM_BUILD_TYPE} is set
     [echo] Value Buld is now  ${PARAM_BUILD_TYPE} is set
     [echo] Value Buld is now  Release is set
main:
BUILD SUCCESSFUL
Total time: 0 seconds

Он работает для меня, чтобы реализовать условие, так что он надеется, что это поможет.