46

是否有可用于 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>

如果条件为真,上面的脚本将复制文件。如果条件为假并且我想复制另一个文件怎么办?在蚂蚁中可以吗?

我可以将参数传递给上述任务并确保传递的参数是

4

5 回答 5

44

if属性不存在<copy>。它应该应用于<target>.

下面是一个示例,说明如何使用depends目标的属性以及ifunless属性来控制相关目标的执行。两者中只有一个应该执行。

<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。

于 2013-01-24T12:18:40.527 回答
22

您也可以使用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>
于 2013-01-24T19:21:16.333 回答
16

在目标上使用条件的古怪语法(由 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 支持多种语言(参见脚本任务),我更喜欢Groovy,因为它的语法简洁,而且它在构建中表现得非常好。

抱歉,大卫我不是ant-contrib的粉丝。

于 2013-01-24T20:13:22.387 回答
10

从 ant 1.9.1 开始,您可以使用 if:set 条件:https ://ant.apache.org/manual/ifunless.html

于 2016-01-13T10:42:00.683 回答
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>

在我的情况DPARAM_BUILD_TYPE=Debug下,如果提供了它,我需要为 Debug 构建,否则我需要构建 Release 构建。我像上面写的那样工作,我已经测试过它对我来说工作正常。

并且属性${build.type}我们可以将它传递给其他目标或宏定义以进行我在我的其他蚂蚁宏定义中所做的处理。

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

它对我来说可以实现条件,所以发布希望它会有所帮助。

于 2015-12-13T06:47:33.370 回答