蚁巢条件

时间:2018-08-28 12:28:24

标签: build ant

我有一个蚂蚁build.xml文件,其中包含以下代码段:

<condition property="apiUrl" value="apiUrl1">
  <and>
    <equals arg1="${area}" arg2="area1"/>
    <equals arg1="${env}" arg2="stage"/>
  </and>
</condition>
<condition property="apiUrl" value="apiUrl2">
  <and>
    <equals arg1="${area}" arg2="area1"/>
    <equals arg1="${env}" arg2="develop"/>
  </and>
</condition>

从上面可以看到,<equals arg1="${area}" arg2="area1"/>被检查了两次,代码段的逻辑等效于伪代码:

if (${area} == 'area1' and ${env} == 'stage') {
  apiUrl = 'apiUrl1'
}
if (${area} == 'area1' and ${env} == 'develop') {
  apiUrl = 'apiUrl2'
}

如何更改build.xml,使其逻辑变为以下嵌套条件?

if (${area} == 'area1') {
  if (${env} == 'stage') {
    apiUrl = 'apiUrl1'
  }
  if (${env} == 'develop') {
    apiUrl = 'apiUrl2'
  }      
}

我的蚂蚁版本是1.10.3

2 个答案:

答案 0 :(得分:1)

在Ant中,这种看似微小的变化看起来如此尴尬的原因是,虽然仅通过condition任务控制属性的条件设置,但逻辑的条件流却被控制在target级别。因此,如果您要根据条件运行或跳过某些步骤,则必须创建一个单独的目标,该目标首先检查条件,然后告诉您的主要目标是否应运行。

<target name="setApiUrl" depends="checkArea" if="isArea1">
    <condition property="apiUrl" value="apiUrl1">
        <equals arg1="${env}" arg2="stage"/>
    </condition>

    <condition property="apiUrl" value="apiUrl2">
        <equals arg1="${env}" arg2="develop"/>
    </condition>
</target>

<target name="checkArea">
    <condition property="isArea1">
        <equals arg1="${area}" arg2="area1"/>
    </condition>
</target>

答案 1 :(得分:0)

您可以使用script代替condition这样的任务来实现:

<project default="init" name="My Project">

    <property name="area" value="area1" />
    <property name="env" value="develop" />

    <target name="init">
        <script language="javascript"> 
            if (project.getProperty('area') == 'area1') {
                if (project.getProperty('env') == 'stage') {
                    project.setProperty('apiUrl', 'apiUrl1');
                }
                if (project.getProperty('env') == 'develop') {
                    project.setProperty('apiUrl', 'apiUrl2');
                }      
            }
        </script>
        <echo>${apiUrl}</echo>
    </target>

</project>