包含不覆盖属性变量的文件

时间:2015-11-03 17:46:18

标签: xml ant build.xml

我在reading the snippet on the include vs import task之后的理解是使用import会覆盖目标的功能,使用include意味着您必须使用目标的前置版本才能获得包含版本的行为。我的最终目标是不一定是目标,而是从另一个build.xml文件导入/包含属性值。我创建了这两个build.xml文件,试图向我自己说明它是如何工作的。

我的第一个,dog.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project name="dog">

    <include as="corgi" file="corgi.xml" />

    <property name="breed" value="mutt" />
    <property name ="bark" value="woof"/>

    <target name="nameit">
        <echo>This dog is a ${breed}</echo>
    </target>

    <target name="startBarking">
        <echo>${bark}, ${bark}, ${bark}!</echo>
    </target>   

</project>

和我想要包含的build.xml,corgi.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project name="corgi">

    <property name="breed" value="corgi" />
    <property name="bark" value="bow-wow" />

    <target name="nameit">
        <echo>This dog is a ${breed}</echo>
    </target>

    <target name="startBarking">
        <echo>${bark}, ${bark}, ${bark}!</echo>
    </target>

</project>

鉴于我正在使用include,我希望在运行属于dog.xml的目标时得到一个“woofs”,但是corgi.xml会覆盖该文件,而我是无论我是否使用includeimport,都会得到一个“低头”,表示“哇哇”。这里发生了什么,如何在仍然可以访问dog.xml的属性的同时包含corgi.xml文件?

1 个答案:

答案 0 :(得分:0)

问题是因为我似乎错过了属性是不可变的;当您第一次设置它们时,它们无法更改。根据属性文档:

  

属性是不可变的:无论是谁设置属性,都会将其冻结为其余的构建;他们绝对不是变数。

因此,要获取dog.xml的行为,只要在引入corgi.xml之前设置了dog.xml属性,您将获得这些属性的dog.xml版本。