您应该使用for 而不是foreach,因为foreach 使用antcall 而for 使用macrodef。
注意:与 antcontrib1.0b2 一起使用,最新版本的 antcontrib1.0b3 有一些错误,将失败:
BUILD FAILED
if doesn't support the nested "isgreaterthan" element.
一个带有 for 的解决方案,不需要额外的目标,所有工作都在顺序中完成:
<project>
<!-- Import AntContrib -->
<taskdef resource="net/sf/antcontrib/antlib.xml" />
<property name="sl.app.server.list" value="server1,server2"/>
<!-- make use of jdk builtin javascript engine (since jdk 1.6.0_06) -->
<script language="javascript">
project.setProperty('serveritems', project.getProperty("sl.app.server.list").split(',').length);
</script>
<for list="${sl.app.server.list}" param="server" delimiter=",">
<sequential>
<echo>
Remaining $${serveritems} => ${serveritems}
process Server : @{server}
</echo>
<!--
NOTE : you have to use @{..} syntax here !
<sshexec host="@{server}" ...
-->
<if>
<isgreaterthan arg1="${serveritems}" arg2="1"/>
<then>
<echo>Waiting for Rolling deploy 2 min...</echo>
<sleep seconds="120"/>
</then>
</if>
<!-- this doesn't work correctly, note the output
Remaining ${serveritems} => -1 in second loop -->
<!--
<math result="serveritems" operand1="${serveritems}" operation="-" operand2="1" datatype="int"/>
-->
<!-- decrease serveritems -->
<script language="javascript">
project.setProperty('serveritems', parseInt(project.getProperty('serveritems')) - 1);
</script>
</sequential>
</for>
</project>
输出错误的工作 <math result ... /> 以减少服务器项:
[echo] Remaining ${serveritems} => 2
[echo] process Server : server1
[echo]
[echo] Waiting for Rolling deploy 2 min...
[echo] Remaining ${serveritems} => -1
[echo] process Server : server2
[echo]
使用脚本语言 javascript 输出减少服务器项:
[echo] Remaining ${serveritems} => 2
[echo] process Server : server1
[echo]
[echo] Waiting for Rolling deploy 2 min...
[echo] Remaining ${serveritems} => 1
[echo] process Server : server2
[echo]
最后 => 请注意使用 @{..} 进行参数替换,就像在顺序的宏定义中一样!