我们想在不使用foreach的情况下遍历ant中的目录结构。 是否有任何优雅的方式来做同样的事情?
答案 0 :(得分:3)
apply task可以遍历一组目录或文件
<target name="run-apply">
<apply executable="echo">
<dirset dir="src"/>
</apply>
</target>
我个人喜欢groovy ANT task
<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>
任务罐的安装很容易自动化:
<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>
答案 1 :(得分:0)
简短回答:不是。有很多方法,但为了清晰和简单,我更喜欢ant-contrib <for/>
任务。使用<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的位置项目)。