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。
我知道我可以使用<if>
和<isset>
属性标志以另一种方式解决问题,但我只是想知道这怎么可能。如果您能帮助我理解这种不一致的行为,那就太好了。
【问题讨论】:
您是否确认它正确加载了属性文件并在您的 Windows 系统上设置了值?在您尝试将bla
设置为空字符串之前,<echo>
会针对 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 的文件内属性扩展,默认为 ""
。
但是,如果<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 上。
【讨论】:
以上是关于Ant 属性在 Windows 中是可变的,但在 Unix 中不是?的主要内容,如果未能解决你的问题,请参考以下文章
“ApolloClient<NormalizedCacheObject>”类型中缺少属性“setLink”,但在“ApolloClient<any>”类型中是必需的
我们可以在 JavaScript 中为不可变对象添加属性吗?
如何将 ant expandproperties 与 windows pathseparator 一起使用