是否有可用于Ant任务的if / else条件?
这是我到目前为止所写的内容:
<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>
如果条件为真,上面的脚本将复制该文件。如果条件为假并且我希望复制另一个文件怎么办?这可能在Ant?
我可以将一个参数传递给上面的任务,并确保传递的参数是
答案 0 :(得分:38)
if
不存在<copy>
属性。它应该应用于<target>
。
下面是一个示例,说明如何使用目标的depends
属性和if
and unless
attributes来控制从属目标的执行。只有两个中的一个应该执行。
<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。
答案 1 :(得分:20)
您也可以使用ant contrib's 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>
答案 2 :(得分:14)
在目标上使用条件的古怪语法(由Mads描述)是在核心ANT中执行条件执行的唯一支持方式。
ANT不是一种编程语言,当事情变得复杂时,我选择在我的构建中嵌入一个脚本,如下所示:
<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的粉丝。答案 3 :(得分:7)
从ant 1.9.1开始,你可以使用if:set condition:https://ant.apache.org/manual/ifunless.html
答案 4 :(得分:0)
<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>
在我的Case DPARAM_BUILD_TYPE=Debug
中,如果提供的是,我需要为Debug进行构建,否则我需要构建Release build。
我写的是上面条件它有效,我已经测试过如下它对我来说工作正常。
属性${build.type}
我们可以将它传递给其他目标或macrodef进行处理,我正在其他的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
它对我来说是实施条件所以张贴希望它会有所帮助。