我需要实时更改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部分可以工作,但是它不会保留新值。 我尝试了很多变化,没有一个变化。 我正在使用ant-contrib。
非常感谢帮助! 亚当
答案 0 :(得分:1)
foreach的target属性应该是被调用目标的名称。
我想这里应该是<foreach list="${list}" target="agent_version_to_path" param="var" delimiter="," />
如果我错了,请发布你的target2并解释你想要做的事情。
编辑:
您的编辑确定,您是否已尝试覆盖=“是”?
你不能改变你的财产名称(var),这是非常令人困惑的!
答案 1 :(得分:1)
我不是ant-contrib任务的粉丝。您是否考虑过嵌入scripting language?
<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
<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>
答案 2 :(得分: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的所有帮助,我用这些想法来提出这个想法。我会评价你,但我不能:(对不起!