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?
Я мог бы передать параметр в вышеуказанную задачу и убедиться, что переданный параметр
Ответы
Ответ 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.
Ответ 4
Так как ant 1.9.1 вы можете использовать условие if: set: https://ant.apache.org/manual/ifunless.html
Ответ 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
Он работает для меня, чтобы реализовать условие, так что он надеется, что это поможет.