我需要一些帮助。我有一个目标,我在其中循环使用foreach从ant-contrib文件集。对于循环的每次迭代,我调用另一个目标(让它称为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>
首先,一个建议:考虑是否真的有必要使用自增整数——如果你只是想要一个唯一的、可排序的文件名,你可以使用<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到底是什么——不是编程语言,而是矩阵依赖语言。
在循环中使用自增int是全功能编程语言的一个特性。如果确实需要,可以开发Ant-contrib之类的库来提供这样的功能。但是,我仍然更喜欢时间戳而不是整数。当您将文件名处理为字符串时,时间戳可以正确排序,而不需要任何额外的努力,而int将导致类似["1","10","2","3","4"...]
的结果。