使用普通蚂蚁调用文件集中每个文件的任务,文件名作为参数(没有贡献任务,没有自己的任务)

时间:2012-02-01 08:14:21

标签: ant

问题:

如果您的文件遵循某种命名约定(例如包含语言环境)并且需要通过ant脚本在每个文件的基础上进行处理,那么ant中有哪些可能性?

示例:

要处理的文件:

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

应该为所有文件调用一个任务,并将其文件名作为参数。文件名中包含的语言环境需要由正则表达式提取并作为参数传递给外部工具。只要你有文件名,提取就会直截了当。

限制:

  • Plain Ant(1.7),没有扩展名允许没有像foreach这样的自定义/ contrib任务。需要运行每个香草蚂蚁(1.7)安装。

1 个答案:

答案 0 :(得分:4)

我非常确定无法创建自己的custom task或使用ant-contrib,无法为每个文件调用任务。但是有一些方法可以让ant自动检索ant-contrib(或自定义jar),这样你就可以获得所需的结果。这是TIBant使用的方法,它具有类似的要求(因此任何人都可以轻松地为开发做出贡献),

第1步:下载Apache Ivy

Apache Ivy可用于检索ant-contrib等依赖项。我使用以下ant属性和目标来下载和加载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>

您还可以使用echoxml

从ant脚本动态输出此文件

第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一样。