【问题标题】:Passing mutliple params in ant foreach task在ant foreach任务中传递多个参数
【发布时间】:2016-10-18 17:26:24
【问题描述】:

我有一个蚂蚁任务,我想从 foreach 循环中调用它,如下所示:

<target name="iteratorTarget">
    <foreach target="copynow" param="some.location">
            <path refid="some.classpath"/>
    </foreach>
</target>


<target name="copynow">
    <!-- Do some regex related operations -->
    <propertyregex property="from.directory" input="${some.location}" select="\1"/>
    <copy file="${from.directory}" todir="${dest.dir}"/>
</target>

正如您在上面的代码中看到的,我从 foreach 传递的一个参数是some.location。现在我想传递另一个参数dest.dir,我在上面代码的倒数第二行中使用了它。

那么,我如何将多个参数(在我的情况下为some.locationdest.dir)从我在上面的代码中定义的foreach 传递到copynow 目标。

编辑

这里是我的问题的更多细节。首先是一些前提:

基本上,我有一个类路径文件,其中包含已定义的 jar 位置列表。示例 -

direc1/subdir1/somejar1.jar
direc2/subdir2/somejar2.jar
direc3/subdir3/somejar3.jar

根据以上信息,我想确保无论何时将 jar 复制到给定的 dest。 ,其等效许可证也会复制到给定的目标。

许可证存储如下-

direc1/subdir1/license/license*.txt
direc2/subdir2/license/license*.txt
direc3/subdir3/license/license*.txt

我在这里想要实现的是我想遍历类路径条目,然后使用正则表达式,获取目录直到 subdir 。例如 'direc1/subdir1' ,然后我将 license 附加到获得的正则表达式并复制该文件夹中存在的所有文件,然后我将 jar 复制到所需的目的地。

我上面给出的代码实现了同样的效果。

唯一剩下的是复制目标目录不是恒定的并且会变化。因此,我想以某种方式将复制目标目录作为参数发送到copynow target.Help!

【问题讨论】:

  • foreach 任务不是标准的 ANT 任务。你为什么不描述你想要的行为,然后也许可以用另一种方式来实现?
  • 为了可重用性,macrodef 可能是一个不错的选择,您可以每次传递不同的值。
  • @MarkO'Connor 详细说明了我的问题。请让我知道您的意见

标签: ant ant-contrib


【解决方案1】:

我使用ivy 来管理我的构建依赖项。此工具可用于将本地目录转换为存储库。 尽管此解决方案似乎更复杂(而且确实如此),但它使用工件模式将源文件与其最终复制的位置分离。

正确配置后,可以使用 ivy retrieve 任务将它们放置在构建工作区中。以下将文件保存在“目标”子目录中:

  <target name="build" depends="resolve">
    <ivy:retrieve pattern="target/[organisation]/[artifact][revision].[ext]" conf="compile"/>
    <ivy:retrieve pattern="target/[organisation]/[artifact]" conf="licence"/>
  </target>

示例

├── build.xml
├── ivysettings.xml
├── ivy.xml
├── repo
│   ├── direc1
│   │   └── subdir1
│   │       ├── licence
│   │       │   └── licenceOne.txt
│   │       └── somejar1.jar
│   ├── direc2
│   │   └── subdir2
│   │       ├── licence
│   │       │   └── licenceTwo.txt
│   │       └── somejar2.jar
│   └── direc3
│       └── subdir3
│           ├── licence
│           │   └── licenceThree.txt
│           └── somejar3.jar
└── target
    ├── myOrg1
    │   ├── licenceOne.txt
    │   └── somejar1.jar
    ├── myOrg2
    │   ├── licenceTwo.txt
    │   └── somejar2.jar
    └── myOrg3
        ├── licenceThree.txt
        └── somejar3.jar

build.xml

<project name="demo" default="build" xmlns:ivy="antlib:org.apache.ivy.ant">

  <available classname="org.apache.ivy.Main" property="ivy.installed"/> 

  <target name="resolve" depends="install-ivy">
    <ivy:resolve/>
  </target>

  <target name="build" depends="resolve">
    <ivy:retrieve pattern="target/[organisation]/[artifact][revision].[ext]" conf="compile"/>
    <ivy:retrieve pattern="target/[organisation]/[artifact]" conf="licence"/>
  </target>

  <target name="clean">
    <delete dir="target"/>
    <ivy:cleancache/>
  </target>

  <target name="install-ivy" description="Install ivy" unless="ivy.installed">
    <mkdir dir="${user.home}/.ant/lib"/>
    <get dest="${user.home}/.ant/lib/ivy.jar" src="http://search.maven.org/remotecontent?filepath=org/apache/ivy/ivy/2.4.0/ivy-2.4.0.jar"/>
    <fail message="Ivy has been installed. Run the build again"/>
  </target>

</project>

注意事项:

  • 安装 ivy jar 的特殊 install-ivy 目标。

ivysettings.xml

<ivysettings>
  <settings defaultResolver="central"/>
  <resolvers>
    <ibiblio name="central" m2compatible="true"/>
    <filesystem name="custom">
      <artifact pattern="${ivy.settings.dir}/repo/[maindir]/[subdir]/[artifact][revision].[ext]" />
      <artifact pattern="${ivy.settings.dir}/repo/[maindir]/[subdir]/licence/[artifact]" />
    </filesystem>
  </resolvers>
  <modules>
    <module organisation="myOrg1" resolver="custom"/>
    <module organisation="myOrg2" resolver="custom"/>
    <module organisation="myOrg3" resolver="custom"/>
  </modules>
</ivysettings>

注意事项:

  • “myOrg1”、“myOrg2”和“MyOrg3”依赖项从“repo”目录下的本地文件系统解析
  • 文件系统解析器中的每个模式都旨在查找文件
  • 指定了特殊的非标准“maindir”和“subdir”属性(参见 ivy 文件)

ivy.xml

<ivy-module version="2.0" xmlns:e="http://ant.apache.org/ivy/extra">
  <info organisation="com.myspotontheweb" module="demo"/>

  <configurations>
    <conf name="compile" description="Jar files"/>
    <conf name="licence" description="Licence files"/>
  </configurations>

  <dependencies>
    <dependency org="myOrg1" name="somejar"        rev="1" e:maindir="direc1" e:subdir="subdir1" conf="compile->default"/>
    <dependency org="myOrg1" name="licenceOne.txt" rev="1" e:maindir="direc1" e:subdir="subdir1" conf="licence->default"/>

    <dependency org="myOrg2" name="somejar"        rev="2" e:maindir="direc2" e:subdir="subdir2" conf="compile->default"/>
    <dependency org="myOrg2" name="licenceTwo.txt" rev="2" e:maindir="direc2" e:subdir="subdir2" conf="licence->default"/>

    <dependency org="myOrg3" name="somejar"          rev="3" e:maindir="direc3" e:subdir="subdir3" conf="compile->default"/>
    <dependency org="myOrg3" name="licenceThree.txt" rev="3" e:maindir="direc3" e:subdir="subdir3" conf="licence->default"/>
  </dependencies>

</ivy-module>

注意:

  • 这是列出构建依赖项的文件。
  • 注意额外的“maindir”和“subdir”属性。文件系统解析器用于查找文件

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多