在ant-contrib中增加整数

时间:2014-05-21 14:22:36

标签: ant ant-contrib

我需要一些蚂蚁的帮助。我有一个目标,我使用来自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>

1 个答案:

答案 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 &lt;= 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"...]之类的结果。