我在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会覆盖该文件,而我是无论我是否使用include
或import
,都会得到一个“低头”,表示“哇哇”。这里发生了什么,如何在仍然可以访问dog.xml的属性的同时包含corgi.xml文件?
答案 0 :(得分:0)
问题是因为我似乎错过了属性是不可变的;当您第一次设置它们时,它们无法更改。根据属性文档:
属性是不可变的:无论是谁设置属性,都会将其冻结为其余的构建;他们绝对不是变数。
因此,要获取dog.xml的行为,只要在引入corgi.xml之前设置了dog.xml属性,您将获得这些属性的dog.xml版本。