我正在使用Ant进行自动构建过程。
一个目标是检查是否已设置变量,如果没有,则将其设置为空字符串并将其作为环境键导出到可执行文件。我有多个属性文件,或者定义了bla
属性。所以我遍历我的文件列表并执行以下操作:
<for list="${propertyfiles}" param="mypropertyfile">
<var name="bla" unset="true" />
<property file="@{mypropertyfile}.properties" />
<property name="bla" value=""/>
... use the "bla" property for something ...
</for>
解释这些界限:
<var name="bla" unset="true" />
是为了确保先前的循环传递没有使用任何值。我包含属性文件,该属性文件具有或未定义bla
属性。
<property file="@{mypropertyfile}.properties" />
确保我可以使用bla
属性。我认为使用属性的不变性是明智的。所以
<property name="bla" value=""/>
设置属性,以防它在我的属性文件中未定义。如果已定义,则理论上不能覆盖初始属性值。
现在奇怪的是:在我的unix系统上,这种方法就像一个魅力,在Windows上 它没有; 已定义的属性值被空字符串覆盖。两台机器都安装了蚂蚁1.8。
我知道我可以使用<if>
和<isset>
属性标志以另一种方式解决问题,但我只是想知道这是如何实现的。如果你能帮助我理解这种不一致的行为,那将会很棒。
答案 0 :(得分:0)
变量和未设置是Variable Task的一部分,因为你没有提到我用1.0b2和1.0b3测试过的ant-contrib的版本。虽然这只是一个数据点我认为你可以从假设结果的真实性开始,即两个窗口上的unset="true"
和ant 1.8中的* nix允许你重新分配其他不可变属性的值,如果它之前已设置(无论是在for循环内部还是之外),否则无效。
然后在未设置的调用和将属性设置为默认值之间存在一个问题,即在Windows上,您的属性未按预期设置。因此,我会看两个可能的原因:
\"
转义任何不常见的字符。""
。但是,如果<echo> ${bla}
显示您的属性实际上是从文件中正确加载的,那么我首先将您的代码移出for循环,然后查看它是否适用于单个案例。我的测试代码:
<project name="propertyMutator" default="mutator">
<taskdef resource="net/sf/antcontrib/antlib.xml"/>
<echo>Running ${ant.version}</echo>
<target name="mutator">
<for list="one,two,three" param="mypropertyfile">
<sequential>
<var name="bla" unset="true" />
<property file="@{mypropertyfile}.properties" />
<echo message="Bla before default is: ${bla}"/>
<property name="bla" value="default value"/>
<echo message="Bla after default is: ${bla}"/>
</sequential>
</for>
</target>
</project>
与
one.properties: bla=${some.var}
two.properties: nothing=toSee
three.properties: bla=hello1
bla=hello2
bla=hello3
打印
Buildfile: C:\workspace\proj\propertyMutator.xml
[echo] Running Apache Ant(TM) version 1.8.3 compiled on February 26 2012
mutator:
[echo] Bla before default is: ${some.var}
[echo] Bla after default is: ${some.var}
[echo] Bla before default is: ${bla}
[echo] Bla after default is: default value
[echo] Bla before default is: hello3
[echo] Bla after default is: hello3
在linux和windows上。