0

我们想在不使用 foreach 的情况下遍历 ant 中的目录结构。有什么优雅的方法可以做到这一点吗?

4

2 回答 2

3

apply 任务可以遍历一组目录或文件

<target name="run-apply">
    <apply executable="echo">
        <dirset dir="src"/>
    </apply>
</target>

我个人喜欢groovy ANT 任务

<target name="run-groovy">
    <taskdef name="groovy" classname="org.codehaus.groovy.ant.Groovy"/>
    <dirset id="dirs" dir="src"/>
    <groovy>
        project.references.dirs.each {
            ant.echo it
        }
    </groovy>
</target>

任务 jar 的安装很容易自动化:

<target name="install-groovy">
  <mkdir dir="${user.home}/.ant/lib"/>
  <get dest="${user.home}/.ant/lib/groovy-all.jar" src="http://search.maven.org/remotecontent?filepath=org/codehaus/groovy/groovy-all/2.1.1/groovy-all-2.1.1.jar"/>
</target>

最后,如果您通过其他构建文件进行迭代,则subant任务非常有用:

<target name="run-subant">
    <subant>
        <fileset dir="src" includes="**/build.xml"/>
    </subant>
</target>
于 2013-03-06T21:17:06.047 回答
0

简短的回答:不是。有一些方法可以解决这个问题,但<for/>为了清晰和简单,我更喜欢 ant-contrib 任务。通过该<local/>任务,您现在可以本地化变量的值。以前,您有时必须使用 ant-contrib 的<var/>任务来重置值,这样您就可以一遍又一遍地循环它们。

<for param="directory">
    <fileset dir="${some.dir}"/>
    <sequential>
        <local name="foo"/>
        <local name="bar"/>  <!-- Properties that may change with each iteration -->
        <!-- Here be dragons -->
    </sequential>
</for>

它干净、简单且易于理解。许多人对 Ant Contrib 的最大问题是不是每个人都可能将它安装在他们的$ANT_HOME/lib目录中。够远了。因此,如果您使用 ant-contrib,请将其作为您项目的一部分。

我将 ant-contrib jar 放入${basedir}/antlib/antcontrib,然后将其放入我的程序中:

<taskdef resource="net/sf/antcontrib/antlib.xml">
    <classpath>
        <fileset dir="${basedir}/antlib/antcontrib"/>
    </classpath>
</taskdef>

现在,当有人检查我的项目时,他们已经安装了 ant-contrib(因为它在我的项目中)并且可以访问(因为我将我的<taskdef>任务指向我项目中 ant-contrib.jar 的位置)。

于 2014-02-13T17:59:57.040 回答