2

所以......我有 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>"/>

这里的警告是两者都具有相同的属性名称。它不能改变。

所以,最后,我应该得到如下属性:

Var1=<property_from_**first**_loaded_property_file>

Var2=<property_from_**second**_loaded_property_file>

但相反 - 我得到迹象表明第一个属性文件中的属性 (Var1) 没有取消设置,然后用第二个属性文件中的新值填充。ant-contribs unset 应该处理的事情:/ ...类似于:

Var1 = Var2

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

4

3 回答 3

1

我认为问题在于,即使您将变量加载到 antcontribvar中,它仍然首先是蚂蚁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:\Users\mfelzani\workspace-junk\junk\build.xml
test:
load-more-prop:
 [echo] 7
 [echo] 1
BUILD SUCCESSFUL
Total time: 905 milliseconds

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

于 2012-01-30T03:36:30.500 回答
0

您无法取消设置该值。

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

您必须取消设置变量

CORRECT: <var name="Var1" unset="true"/>
于 2012-01-25T15:27:21.080 回答
0

如果您需要覆盖某些现有属性或用户属性(那些通过 ant 命令行
参数 -Dkey=value 定义的属性),您可以使用Ant Plugin 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>
于 2012-01-31T20:15:09.020 回答