当加载两个扩展属性文件时,无法使用ant contrib取消设置属性



所以。。。我有build.xml,它从basedir加载属性文件。

然后,作为目标,我执行以下操作:

<var name="Var1" value="<property_from_**first**_loaded_property_file>" />
<var name="<property_from_**first**_loaded_property_file>" unset="true"/>
<property file="../<other directory>/<**second**_property_file>.properties" />
<var name="Var2" value="<property_from_**second**_loaded_property_file>"/>

此处的ceavat是两者都具有相同的属性名称。它无法更改。

所以,最后,我应该得到这样的属性:

Var1=<property_from_**first**_loaded_property_file>
Var2=<property_from_**second**_loaded_property_file>

但是——我得到的迹象表明,第一个属性文件中的属性(Var1)没有被取消设置,然后用第二个属性文件的新值填充。蚂蚁后悔不该处理的事情:/。。。类似于:

Var1 = Var2

为什么我没有得到预期的结果?

我认为问题是,即使您将变量加载到一个antcontrib var中,它仍然首先是一个ant property,因此是不可变的。

我知道你不能更改属性文件,但你对脚本本身有什么样的自由?您可以尝试利用作用域规则和antcallback任务来确定变量加载的范围。

例如,以下实现了——尽管有些混乱——我认为你想要的:

<?xml version="1.0" encoding="utf-8"?>
<project name="Test" basedir=".">
    <path id="ant.classpath">
        <fileset dir="${basedir}">
            <include name="ant-contrib_AP.jar"/>
        </fileset>
    </path>
    <taskdef resource="net/sf/antcontrib/antcontrib.properties" classpathref="ant.classpath"/>
    <target name="test">
        <antcallback target="load-more-prop" return="Var2"/>
        <loadproperties>
            <file file="prop1.properties"/>
        </loadproperties>
        <property name="Var1" value="${var}" />
        <echo>${Var1}</echo>
        <echo>${Var2}</echo>
    </target>
    <target name="load-more-prop">
        <loadproperties>
            <file file="prop2.properties"/>
        </loadproperties>
        <property name="Var2" value="${var}" />
    </target>
</project>

在我的控制台中,我看到:

Buildfile: C:Usersmfelzaniworkspace-junkjunkbuild.xml
test:
load-more-prop:
 [echo] 7
 [echo] 1
BUILD SUCCESSFUL
Total time: 905 milliseconds

它与我分别在prop1.properties和prop2.properties中为var属性设置的值相匹配。

您不能取消设置该值。

WRONG: <var name="<property_from_**first**_loaded_property_file>" unset="true"/>

您必须取消设置变量

CORRECT: <var name="Var1" unset="true"/>

如果您需要覆盖某些现有属性或用户属性(通过ant命令行
parameter-Dkey=value定义的属性),您可以使用ant插件Flaka作为antcontrib的替代方案
使用Flaka的let任务,您可以直接创建新属性或覆盖任何现有属性:

<project xmlns:fl="antlib:it.haefelinger.flaka">
 <property name="foo" value="bar"/>
 <!-- create new property -->
 <fl:let>foo := 'baar'</fl:let>
 <echo>$${foo} => ${foo}</echo>
 <!--
  overwrite existing property
  notice the double '::' in foo ::= 'baz'
 -->
 <fl:let>foo ::= 'baz'</fl:let>
 <echo>$${foo} => ${foo}</echo>
</project>

相关内容

  • 没有找到相关文章

最新更新