2

我正在使用 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上却没有;定义的属性值被空字符串覆盖。两台机器都安装了ant 1.8。

我知道我可以使用<if><isset>属性标志以另一种方式解决问题,但我只是想知道这怎么可能。如果您能帮助我理解这种不一致的行为,那就太好了。

4

1 回答 1

0

变量和未设置是变量任务的一部分,因为你没有提到我用 1.0b2 和 1.0b3 测试过的 ant-contrib 版本。虽然这只是一个数据点,但我认为您可以首先假设结果的真实性,即unset="true"在 windows 和 ant 1.8 中的 *nix 上,如果之前已设置,您可以重新分配其他不可变属性的值(无论是在 for 循环内部还是外部),否则无效。

因此,在未设置的调用和将您的属性设置为默认值之间存在一个问题,即在 Windows 上,您的属性未按预期设置。因此,我会考虑两个可能的原因:

  1. 属性文件不符合加载规范,例如,您可以尝试运行类似此程序的 unix2dos 版本以消除任何意外的 CRLF/LF 混淆,检查您是否使用 ISO 8859-1 字符编码(您可以使用类似Text文件编码检测器),并使用\".
  2. 在属性文件中,属性的最后一个定义获胜,因此您可以拥有,例如,Linux 特定的文件内属性扩展,默认为""在您的 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上。

于 2012-08-13T11:03:23.153 回答