更新特性文件后重新加载特性



在使用propertyfile任务更新属性后,我正在尝试读取该属性。类似的东西

<property file="test.properties" />
<echo>before :: ${modules}</echo>
<propertyfile file="test.properties" >
   <entry key="modules" type="string" operation="+" value="foo" />
</propertyfile>
<property file="${status.path}/test.properties" />
<echo>after :: ${modules}</echo>.

第二次似乎没有加载。但属性文件已更新。

您可以使用忽略主目标运行时属性的antcall任务调用新的ant运行时-只需确保包含inheritAll="false"

<target name="main">
    <property file="test.properties"/>
    <echo>before :: ${modules}</echo>
    <propertyfile file="test.properties">
        <entry key="modules" type="string" operation="+" value="foo" />
    </propertyfile>
    <antcall target="second-runtime" inheritAll="false"/>
</target>
<target name="second-runtime">
    <property file="${status.path}/test.properties" />
    <echo>after :: ${modules}</echo>
</target>

antcall参考

正如sudocode已经提到的,在Core中Ant属性是不可变的,这是有充分理由的
使用Antelope Ant Tasks中的未设置任务,您可以使用一行代码取消设置文件中设置的所有属性:

<unset file="test.properties"/>

之后

<propertyfile file="test.properties" >
   <entry key="modules" type="string" operation="+" value="foo" />
</propertyfile>

将起作用。

提示:该任务仅适用于普通属性,不适用于xmlproperties
但有一个简单的解决方法,只需使用
<echoproperties prefix="..." destfile="foo.properties"/>
,然后使用
<unset file="foo.properties"/>
如果你不想只在特定的任务中使用Antelope,你可以编写一个macrodef或自己的具有类似功能的任务。

对于这种情况,当整个属性文件被加载两次时,我建议在第一次和第二次加载时使用不同的前缀。首先加载prefix属性等于first。访问带有此前缀的属性,即属性foo将作为first.foo访问。然后保存属性文件并再次加载,但这次没有前缀。您将在合适的地方获得修改后的属性。

如果不使用前缀,第二次加载将不起任何作用,因为ant会阻止属性重写。其他人已经指出了这一点。

Ant属性是不可变的-一旦设置,它们就是固定的。因此,重新加载属性文件不会刷新已经设置的属性的值。

此宏允许您在修复一个后更改属性值

<macrodef name="set" >
    <attribute name="name"/>
    <attribute name="value"/>
    <sequential>
        <script language="javascript">
            <![CDATA[
            project.setProperty("@{name}", "@{value}");
            ]]>
        </script>
    </sequential>
</macrodef>

您可以创建一个新的属性文件并将属性保存在新文件中。

在下一行中提供文件的引用。

完成:)

相关内容

  • 没有找到相关文章

最新更新