Ant属性在Windows中是可变的,但不是Unix?

时间:2012-07-09 15:09:26

标签: ant properties immutability unset ant-contrib

我正在使用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>属性标志以另一种方式解决问题,但我只是想知道这是如何实现的。如果你能帮助我理解这种不一致的行为,那将会很棒。

1 个答案:

答案 0 :(得分:0)

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

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

  1. 属性文件不符合Load Specification,例如,您可以尝试运行unix2dos版本,如this program,以消除任何意外的CRLF / LF混淆,检查您使用的是ISO 8859-1字符编码(您可以使用类似Text File Encoding Detector的内容),并使用\"转义任何不常见的字符。
  2. 在属性文件中,属性的最后一个定义获胜,因此您可以在Windows属性之后将Linux特定的文件内属性扩展默认为""
  3. 但是,如果<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上。