加载两个外部属性文件时无法使用 ant-contrib 取消设置属性

发布于 2024-12-29 02:23:56 字数 840 浏览 1 评论 0原文

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

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

So ... I have build.xml that loads property file from basedir.

Then, as the target I perform the following:

<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>"/>

The ceavat here is that both has same property name. It cannot be changed.

So, in the end, I should get the property like:

Var1=<property_from_**first**_loaded_property_file>

Var2=<property_from_**second**_loaded_property_file>

But instead -
I am getting signs that property (Var1) from first properties file is not unset and then filled with new value from second properties file. The thing that ant-contribs unset should deal with :/ ... something like:

Var1 = Var2

Why I am not getting the expected result?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

傲性难收 2025-01-05 02:23:56

我认为问题在于,即使您将变量加载到 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:\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 属性设置的值相匹配。

I think the issue is that even though you're loading the variable into an antcontrib var, it's still an ant property first, thus immutable.

I know you can't change the property files, but what kind of freedom do you have with the script itself? You can try to leverage the scoping rules and the antcallback task to scope where the variables get loaded.

For example, the following achieves - albeit somewhat messily - what I think you're after:

<?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>

In my console I see:

Buildfile: C:\Users\mfelzani\workspace-junk\junk\build.xml
test:
load-more-prop:
 [echo] 7
 [echo] 1
BUILD SUCCESSFUL
Total time: 905 milliseconds

Which matches the values i set in prop1.properties and prop2.properties, respectively, for the var property.

司马昭之心 2025-01-05 02:23:56

您无法取消设置该值。

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

您必须取消设置变量

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

You can't unset the value.

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

You have to unset the variable

CORRECT: <var name="Var1" unset="true"/>
ㄟ。诗瑗 2025-01-05 02:23:56

如果您需要覆盖某些现有属性或用户属性(通过 ant 命令行
参数 -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>

If you need to overwrite some existing property or userproperty (those properties defined via ant commandline
parameter -Dkey=value), you might use Ant Plugin Flaka as alternative for antcontrib.
With Flaka's let task you either create a new property or overwrite any existing property straightforward :

<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>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文