Вызовите задачу для каждого файла в наборе файлов с обычным муравьем с именем файла в качестве параметра (без заданий вклада, без собственных заданий) - PullRequest
5 голосов
/ 01 февраля 2012

проблема:

Если у вас есть файлы, которые следуют определенному соглашению об именах (например, включают в себя локаль) и должны обрабатываться для каждого файла скриптом ant, каковы возможности в ant?

Пример:

Файлы для обработки:

  • file_en-US.txt
  • file_en-GB.txt
  • ...

Задача должна вызываться для всех файлов с именами файлов в качестве параметра. Локаль, содержащаяся в имени файла, должна быть извлечена регулярным выражением и передана внешнему инструменту в качестве параметра. Извлечение будет прямым, как только у вас будет имя файла.

Ограничения:

  • Обычный Ant (1.7), никакие расширения не допускают никаких пользовательских задач / заданий, таких как foreach. Необходимо запустить каждую установку vanilla ant (1.7).

1 Ответ

4 голосов
/ 02 февраля 2012

Я почти уверен, что нет способа общего вызова задачи для каждого файла без создания собственной пользовательской задачи или использования ant-contrib .Однако есть способы заставить ant автоматически получать ant-contrib (или пользовательский jar), чтобы вы могли достичь желаемого результата.Этот подход используется TIBant , к которому предъявляются аналогичные требования (так что любой может внести свой вклад в разработку),

Шаг 1: Загрузите Apache Ivy

Apache Ivy можно использовать для получения зависимостей, таких как ant-contrib.Я использую следующие свойства ant и target для загрузки и загрузки Ivy

<property name="ivy.install.version" value="2.2.0" />
<property name="ivy.jar.dir" location="${user.home}/.ivy2/jars" />
<property name="ivy.jar.file" location="${ivy.jar.dir}/ivy-${ivy.install.version}.jar" />

<target name="-download-ivy" unless="ivy.downloaded">
    <mkdir dir="${ivy.jar.dir}" />
    <!-- download Ivy from web site so that it can be used even without any special installation -->
    <echo message="installing ivy..." />
    <get src="http://repo1.maven.org/maven2/org/apache/ivy/ivy/${ivy.install.version}/ivy-${ivy.install.version}.jar"
         dest="${ivy.jar.file}"
         usetimestamp="true"
         verbose="true" />
</target>

<target name="-check-ivy-downloaded">
    <condition property="ivy.downloaded">
        <and>
            <available file="${ivy.jar.file}" />
            <available file="${ivy.jar.dir}/jsch-0.1.44-1.jar" />
        </and>
    </condition>
</target>

<target name="-load-ivy" depends="-check-ivy-downloaded,-download-ivy" unless="ivy.loaded">
    <path id="ivy.lib.path">
        <fileset dir="${ivy.jar.dir}" includes="*.jar" />
    </path>
    <taskdef resource="org/apache/ivy/ant/antlib.xml" uri="antlib:org.apache.ivy.ant" classpathref="ivy.lib.path" />
    <property name="ivy.loaded" value="true" />
</target>

Шаг 2. Добавление зависимости ant-contrib

Ivy использует «файл плюща» дляуказание зависимостей.Вы можете добавить ant-contrib следующим образом

    <dependency org="ant-contrib" name="ant-contrib" rev="1.0b3" transitive="false"/>

полный файл плюща может выглядеть как

<?xml version="1.0" encoding="ISO-8859-1"?>
<ivy-module version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd">
    <info
    organisation="org.my"
    module="mymodule"
    status="release"/>

    <dependencies>
        <dependency org="ant-contrib" name="ant-contrib" rev="1.0b3" transitive="false"/>
    </dependencies>
</ivy-module>

Вы также можете динамически вывести этот файл из своего скрипта ant, используя echoxml

Шаг 3: Извлечение зависимостей

Используйте Ivy для загрузки ant-contrib (или любых указанных вами зависимостей)

<target name="retrieve" description="retrieve dependancies with ivy" depends="-load-ivy">
    <ivy:retrieve />
    <ivy:artifactproperty name="[module].[artifact]" value="lib/[artifact]-[revision].[ext]" />
</target>

Шаг 4: загрузка ant-contrib

<target name="-load-ant-contrib" depends="retrieve" unless="ant.contrib.loaded">
    <taskdef resource="net/sf/antcontrib/antlib.xml">
        <classpath>
            <pathelement location="${ant-contrib.ant-contrib}" />
        </classpath>
    </taskdef>
    <property name="ant.contrib.loaded" value="true" />
</target>

Шаг 5: Создайте свою цель, которая перебирает файлы, используя for

<target name="mytarget" depends="-load-ant-contrib">
    <for param="file">
        <fileset dir="somedir" includes="..." />
        <sequential>
            <!-- do stuff with @{file} -->
        </sequential>
    </for>
</target>

Если вам нужно только скачать ant-contrib и не использовать Ivy для управления другими зависимостями, вы можете пропустить большую часть вышеперечисленного и просто использовать get для загрузки ant-contrib вТак же, как и выше, загружает Ivy.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...