1

我需要实时更改 ANT 脚本列表的值。情况就是这样;

我有这些属性:

x.y.6.1=something1
x.y.6.2=something2
x.y.6.3=something3

list=6.1,6.2

我希望列表变为 list=something1;something2

这是代码的要点;

<target name="target1">
    <foreach list="${list}" target="target2" param="var" delimiter="," />
</target>

<target name="target2">
    <propertycopy name="var" from="x.y.${var}" silent="true"/>
</target>

现在,propertycopy 部分可以工作,但是,它不会保留新值。我尝试了很多变体,但都没有奏效。我正在使用蚂蚁贡献。

帮助将不胜感激!亚当

4

3 回答 3

1

foreach 的 target 属性应该是调用的目标的名称。

我想应该是这里<foreach list="${list}" target="agent_version_to_path" param="var" delimiter="," />

如果我错了,请发布您的 target2 并解释您要做什么。

编辑:

好的,您的编辑,您是否已经尝试过 override="yes"?

而且你不能改变你的财产名称(var),这很令人困惑!

于 2013-06-23T12:07:21.680 回答
1

我不喜欢ant-contrib任务。您是否考虑过嵌入脚本语言

  <taskdef name="groovy" classname="org.codehaus.groovy.ant.Groovy" classpathref="build.path"/>

  <groovy>
     properties["list"].split(",").each {
        println properties["x.y.${it}"]
     }
  </groovy>

更新

这是一个更完整的示例,它循环并调用另一个目标:

$ ant
Buildfile: build.xml

process:

doSomething:
     [echo] something1

doSomething:
     [echo] something2

BUILD SUCCESSFUL
Total time: 0 seconds

构建.xml

<project name="demo" default="process">

   <property file="build.properties"/>

   <path id="build.path">
      <pathelement location="lib/groovy-all-2.1.5.jar"/>
   </path>

   <target name="process" description="Process values in a list">
      <taskdef name="groovy" classname="org.codehaus.groovy.ant.Groovy" classpathref="build.path"/>

      <groovy>
         properties["list"].split(",").each {
            properties.var = properties["x.y.${it}"]
            ant.ant(target:"doSomething")
         }
      </groovy>
   </target>

   <target name="doSomething">
      <echo>${var}</echo>
   </target>

</project>
于 2013-06-23T12:28:43.953 回答
1

我已经以一种令人讨厌的方式解决了这个问题,但是效果很好!

<project name="Test" default="main">
    <property file="agent.properties" />
    <property file="temp_updates.txt" />
    <taskdef name="propertycopy" classname="net.sf.antcontrib.property.PropertyCopy" />
    <taskdef name="foreach" classname="net.sf.antcontrib.logic.ForEach" />

    <target name="main">
        <property name="Agent Updates" value="6.1,6.2" />
        <antcall target="create_temp_files" />
        <antcall target="agent_updates_target" />
        <propertycopy name="custom.agent.release.group" from="updates" silent="true" override="true" />
    </target>

    <target name="agent_updates_target">
        <foreach list="${Agent Updates}" target="agent_version_to_path" param="var" delimiter="," />
    </target>

    <target name="agent_version_to_path">
        <propertycopy name="var" from="agent.installer.${var}" silent="true" override="true"/>
        <echo message="${var};" file="temp_updates.txt" append="true" />
    </target>

    <target name="create_temp_files">
        <echo message="updates=" file="temp_updates.txt" />
    </target>

</project>

在另一个文件“agent.properties”上,我有那个;

agent.installer.6.3=something3
agent.installer.6.2=something2
agent.installer.6.1=something1
agent.installer.6.0=...
agent.installer.5.6=...
agent.installer.5.0.12=...
agent.installer.5.0.11=...
agent.installer.5.0.9.5=...
agent.installer.3.8=...
agent.installer.3.7=...

结果,创建了一个新文件“temp_updates.txt”,其中包含

updates=something1;something2;

然后我将其加载到实际程序中。

可能不漂亮,但效果很好。

感谢 Skoll 和 Mark O'Connor 的所有帮助,我利用这些想法提出了这个想法。我会评价你,但我不能:(对不起!

于 2013-06-24T09:11:59.057 回答