2015-11-03 46 views
0

我在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> 

由于我使用的是包括,当我运行属于dog.xml的目标时,我希望得到一个“mutof”,但是corgi.xml覆盖了这个文件,并且我得到一个“corgi”,它表示“bow-wow “不管我是否使用includeimport。这里发生了什么,以及如何包含corgi.xml文件,同时仍然可以访问dog.xml的属性?

回答

0

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

属性是不可变的:任何设置属性的人都会先冻结它以用于构建的其余部分;他们绝对不是变数。

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