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

Posted

技术标签:

【中文标题】Ant 属性在 Windows 中是可变的,但在 Unix 中不是?【英文标题】:Ant property is mutable in Windows but not Unix? 【发布时间】:2012-07-09 00:26:46 【问题描述】:

我正在使用 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。

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

【问题讨论】:

您是否确认它正确加载了属性文件并在您的 Windows 系统上设置了值?在您尝试将 bla 设置为空字符串之前,&lt;echo&gt; 会针对 bla 的内容显示什么? 您对我发布的答案中的方法有任何帮助吗?如果您能告诉我们原因是什么,那就太好了。 【参考方案1】:

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

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

    属性文件不符合Load Specification,例如您可以尝试运行类似this program 的unix2dos 版本来消除任何意外的CRLF/LF 混淆,检查您是否使用ISO 8859-1 字符编码(您可以使用 Text File Encoding Detector 之类的东西),并使用 \" 转义任何不寻常的字符。 在属性文件中,最后一个属性定义胜出,因此您可以在 Windows 属性之后有一个特定于 Linux 的文件内属性扩展,默认为 ""

但是,如果&lt;echo&gt; $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 上。

【讨论】:

以上是关于Ant 属性在 Windows 中是可变的,但在 Unix 中不是?的主要内容,如果未能解决你的问题,请参考以下文章

java中是啥是不可变对象和可变对象

“ApolloClient<NormalizedCacheObject>”类型中缺少属性“setLink”,但在“ApolloClient<any>”类型中是必需的

我们可以在 JavaScript 中为不可变对象添加属性吗?

如何将 ant expandproperties 与 windows pathseparator 一起使用

Google 字体 - 可变字体在 Windows 浏览器中不起作用

原始类型变量在 PL/SQL 代码中是不可变的吗?