我有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>
语句吗?我已经阅读了文档,但没有找到任何建议。
答案 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} < ${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>