在if任务中嵌套islessthan - Ant

时间:2015-06-17 08:00:05

标签: ant ant-contrib

我有ant这样的任务:

<target name="mathWala" description="Some sample math operations.">
        <if>
            <islessthan arg1="${op1}" arg2="${limit}"/>
            <then>
                <echo>${op1} is less than ${limit}</echo>
                <antcall target="adder"></antcall>
            </then>
        </if>
    </target>

    <target name="adder">
        <math result="result" operand1="${op1}" operation="+" operand2="1" datatype="int"/>
        <echo>result = ${result}</echo>
    </target>

当我执行上述任务时,我得到的错误是:
if does'nt support the nested "islessthan" element.

我可以同时使用<if><islessthan>语句吗?我已经阅读了文档,但没有找到任何建议。

2 个答案:

答案 0 :(得分:1)

这是antcontrib的最新版本1.0b3中的几个错误之一(对于其他奇怪的内容here),但<if><islessthen ...> 适用于版本antcontrib 1.0b2 < / strong>。
或者你也可以使用带有内置javascript引擎的macrodef(包含在jdk =&gt; 1.6.0_06中),而不是使用被认为是不良做法的target + antcall。
这里有一些改编版answer to another question的片段:

<project>

<property name="foo" value="23"/>
<property name="limit" value="22"/>

<macrodef name="math">
 <attribute name="operation"/>
 <attribute name="operator1"/>
 <attribute name="operator2"/>
 <attribute name="result"/>
 <attribute name="when"/>
 <sequential>
 <script language="javascript">
   // note => use attribute @{when} without ''  !
   if(eval(@{when})) {
    tmp = 0;
    switch ("@{operation}") {
    case "+" :
      tmp = parseInt("@{operator1}") + parseInt("@{operator2}");
      break;
    case "-" :
      tmp = parseInt("@{operator1}") - parseInt("@{operator2}");
      break;
    case "*" :
      tmp = parseInt("@{operator1}") * parseInt("@{operator2}");
      break;
    case "/" :
      tmp = parseInt("@{operator1}") / parseInt("@{operator2}");
      break;
    }
   project.setProperty("@{result}", tmp);
   } else {
     println("Condition: @{when} false !");
   }
 </script>
 </sequential>
</macrodef>

<math operation="/" operator1="${foo}" operator2="11" result="foooo" when=" ${foo} &lt; ${limit} "/>

</project>

故意使用不同的数学运算,如 - ,+,*,/,而不是使用eval(...)来限制macrodef提供的操作类型。

答案 1 :(得分:0)

“if”任务不是标准的ANT功能。有条件地执行ANT目标可以按如下方式完成:

<project name="demo" default="build">

  <property name="opt1"  value="20"/>
  <property name="limit" value="50"/>

  <condition property="is.less.than">
    <scriptcondition language="javascript"><![CDATA[
    self.setValue(Number(project.getProperty("opt1")) < Number(project.getProperty("limit")));
    ]]></scriptcondition>
  </condition>

  <target name="build" if="is.less.than">
    <echo message="${opt1} is less than ${limit}"/>
  </target>

</project>