Мы хотим, чтобы петля через структуру каталогов в муравье без использования foreach. Есть ли элегантный способ сделать то же самое?Петля через структуру каталогов в муравьином
ответ
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>
Наконец, если вы итерации через другой файл сборки es, задача subant очень полезна:
<target name="run-subant">
<subant>
<fileset dir="src" includes="**/build.xml"/>
</subant>
</target>
apply не будет работать для меня, потому что я не хочу запускать новый процесс для каждого элемента. –
@ConstantinoCronemberger Fine .... Отличная задача - более эффективный механизм для циклирования. –
На самом деле я использую maven-antrun-plugin, и в этом случае я могу посмотреть в groovy-maven-plugin. –
Короткий ответ: Не совсем. Есть способы обойти это, но я предпочитаю задачу ant-contrib <for/>
для ясности и простоты. С помощью задачи <local/>
вы можете теперь локализовать значения переменных. Раньше вам приходилось использовать задачу <var/>
от ant-contrib, чтобы сбросить значения, чтобы вы могли перебирать их снова и снова.
<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, поставьте его как часть своего проекта.
Я положу муравей-вно банку в ${basedir}/antlib/antcontrib
и затем поместить это в моей программе:
<taskdef resource="net/sf/antcontrib/antlib.xml">
<classpath>
<fileset dir="${basedir}/antlib/antcontrib"/>
</classpath>
</taskdef>
Теперь, когда кто-то проверяет мой проект, они имеют муравей-вно уже установлен (так как внутри мой проект) и доступный (поскольку я указываю свою задачу <taskdef>
в месте расположения ant-contrib.jar в моем проекте).
Что вы пытаетесь сделать со структурой каталогов? Если вы делаете что-то вроде создания муравьевого проекта в каждом каталоге, вы можете получить необходимую функциональность с помощью [subant] (http://ant.apache.org/manual/Tasks/subant.html) – David