我需要一些蚂蚁的帮助。我有一个目标,我使用来自ant-contrib的foreach循环文件集。我为循环的每次迭代调用另一个目标(让我们称之为doStuff)。
doStuff的输出是我想要存储在文件中的东西。我希望文件具有唯一的名称,我认为每个循环增加的整数都适合我。
我尝试了以下代码的许多变体,但没有成功。我可能还没有深入研究。它似乎与不可变属性一起使用,使目标无状态。虽然我确实喜欢它,但它对我目前的问题并没有帮助。
有没有办法在第一个目标中设置myInt并保持'状态',每次循环都会增加它并将其传递给下一个目标?
<var name="myInt" unset="true"/>
<var name="myInt" value="0"/>
<target name="default">
<foreach target="doStuff" param="theFile">
<fileset dir="" casesensitive="yes">
<depth max="0"/>
</fileset>
</foreach>
</target>
<target name="doStuff" description="Make output directories and run the MXUnit task">
<var name="op1" value="${myInt}"/>
<var name="op2" value="1"/>
<var name="op" value="+"/>
<math result="result" operand1="${op1}" operation="${op}" operand2="${op2}" datatype="int"/>
<var name="myInt" unset="true"/>
<var name="myInt" value="${result}"/>
<!-- Here I save the file with the name ${result}-->
</target>
答案 0 :(得分:4)
首先,建议:考虑是否真的有必要使用自增量整数 - 如果您只想要一个唯一的可排序文件名,则可以使用<tstamp>
代替
这部分应被视为使用Ant的不良做法。
根据您的描述,我看不到您的“测试”目标是如何调用的。所以我假设你只是希望你的“doStuff”每次调用它时都使用一个自增量整数。
您可以尝试<script>
(以下示例代码未经过测试):
<target name="default">
<script language="beanshell" classpathref="your-classpath-ref-id">
String[] theFiles = getProject().getProperty("theFile").split(",");
for (int i = 1; i <= theFiles.length; i++) {
CallTarget antcall = new CallTarget(); // the class of antcall task
antcall.setTarget("doStuff");
Property param1 = antcall.createParam();
param1.setName("number");
param1.setValue(String.valueOf(i));
... // maybe param2 to pass theFiles[i] to doStuff?
antcall.execute();
}
</script>
</target>
如果beanshell的依赖库不在Ant的默认类路径中,则需要在类路径中包含jar,其id为“your-classpath-ref-id”。
<强>更新强>
请阅读David W对此问题的回答: Ant - How can I run the same depends from multiple targets。这个答案很好地说明了Ant的真正含义 - 不是编程语言,而是矩阵依赖语言。
在循环中使用自增量int是全功能编程语言的一个特性。如果您确实需要它,可以开发像Ant-contrib这样的库来提供这样的功能。但是,我仍然更喜欢时间戳超过整数。当您将文件名处理为字符串时,可以正确排序时间戳而无需任何额外的工作,而整数将导致["1","10","2","3","4"...]
之类的结果。