【问题标题】:Increment integer in ant-contribant-contrib 中的增量整数
【发布时间】:2014-05-21 14:22:35
【问题描述】:

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

【问题讨论】:

  • 您的两个目标(默认和测试)如何关联?您能否更好地指定您的示例并使其可运行?
  • 我的错误,目标测试的名称错误。现在更新了。

标签: ant ant-contrib


【解决方案1】:

首先,一个建议:考虑是否真的需要使用自增整数——如果你只是想要一个唯一的、可排序的文件名,你可以改用&lt;tstamp&gt;


这部分应该被视为使用 Ant 的不好的做法

从您的描述中,我看不出您的“测试”目标是如何被调用的。所以我假设你只希望你的“doStuff”在每次被调用时使用一个自增整数。

你可以试试&lt;script&gt;(下面的示例代码没有测试):

<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 的默认 classpath 中,则需要在 classpath 中包含 id 为“your-classpath-ref-id”的 jar。


更新

请阅读 David W 对此问题的回答: Ant - How can I run the same depends from multiple targets。这个答案很好地说明了 Ant 的真正含义——不是一种编程语言,而是一种矩阵依赖语言

使用带有循环的自增 int 是功能齐全的编程语言的一个特性。如果你确实想要它,你可以开发一个像 Ant-contrib 这样的库来提供这样的功能。但是,我仍然更喜欢时间戳而不是整数。当您将文件名作为字符串 处理时,时间戳可以正确排序而无需任何额外的努力,而整数将导致类似["1","10","2","3","4"...] 的结果。

【讨论】:

  • 目标测试是命名为 doStuff,我的错。我认为 似乎是一个好主意,并且脚本有效,但我不明白为什么像这样增加 int 如此困难。我发现想要一个多次执行相同操作并将每个循环循环存储在唯一文件名中的目标是很常见的。当然,tstamp 是有序的,但与 int 相比相当不方便。
  • 在 Ant 脚本中,当需要“多次执行相同的操作”时,一个好的经验法则是首选 &lt;macrodef&gt; 而不是 &lt;target&gt;。 Ant-Contrib 的 &lt;for&gt; 任务与 &lt;macrodef&gt; 任务配合得很好。
  • @ChadNouis 是的,虽然这里的关键是增加一个整数。也许将&lt;for&gt;&lt;var&gt; 一起使用可能会导致不需要任何beanshell 的解决方案。
  • IMO 这个解决方案朝着正确的方向发展,但由于使用 antcall 会为每次调用打开一个新的项目范围并且应该避免使用,所以不是最理想的 - 正如 Chad Nouis 已经提到的那样,使用 macrodef 要好得多。同样使用内置 javascript 引擎作为 beanshell 更好,因为 beanshell 需要额外的 jars(bsf.jar 和 bsh.jar => 2005 年的最新版本 bsh-2.0b4!)。
  • @Rebse 我只是不知道怎么写 JS :P 其实这个问题可以分为两部分。对于第一部分,操作需要一个唯一的文件名。不管他想使用什么样的循环,&lt;tstamp&gt; 应该是比递增 int 更好的选择。对于第二部分,操作必须执行多次。在这里我同意@ChadNouis 的评论。
猜你喜欢
  • 1970-01-01
  • 2017-12-27
  • 1970-01-01
  • 2016-05-24
  • 1970-01-01
  • 2011-07-04
  • 1970-01-01
  • 1970-01-01
  • 2015-04-26
相关资源
最近更新 更多