从include'd / import'ed项目中检索属性值

时间:2010-11-30 12:02:18

标签: ant

我正在尝试使用ant的include或import任务来使用公共构建文件。我被困在从包含文件中检索属性。

这些是我的非工作样本,试图检索“子属性”

使用ant import

父文件

<?xml version="1.0" encoding="UTF-8"?>
<project name="parent" basedir=".">
    <import file="child.xml" />
    <target name="parent-target">
        <antcall target="child-target" />
        <echo message="(From Parent) ${child-property}" />
    </target>
</project>

子文件

<?xml version="1.0" encoding="UTF-8"?>
<project name="child" basedir=".">
    <target name="child-target">
        <property name="child-property" value="i am child value" />
        <echo message="(From Child) ${child-property}" />
    </target>
</project>

输出

parent-target:

child-target:
     [echo] (From Child) i am child value
     [echo] (From Parent) ${child-property}

使用ant include

父文件

<project name="parent" basedir=".">
    <include file="child.xml" />
    <target name="parent-target">
        <antcall target="child.child-target" />
        <echo message="(From Parent) ${child-property}" />
        <echo message="(From Parent2) ${child.child-property}" />
    </target>
</project>

子文件

与上述相同

输出

parent-target:

child.child-target:
     [echo] (From Child) i am child value
     [echo] (From Parent) ${child-property}
     [echo] (From Parent2) ${child.child-property}

如何从父母那里获取“儿童财产”?

3 个答案:

答案 0 :(得分:4)

使用antcall任务时,会为antcall的任务启动新的Ant循环 - 但这不会影响调用者的上下文:

  

被叫目标以新的方式运行   项目;请注意,这意味着   由...设置的属性,引用等   被叫目标不会持久   到调用项目。

使您的简单示例工作的一种方法是将第一个父级更改为:

<target name="parent-target" depends="child-target">
    <echo message="(From Parent) ${child-property}" />
</target>

然后,子目标将在父目标之前的父上下文中执行。

但是,您可能会发现在您不想要的父级上下文中运行子任务会产生副作用。

答案 1 :(得分:1)

这是一种不同的方法,但您可以使用 macrodef

<强> parent.xml

<?xml version="1.0" encoding="UTF-8"?>
<project name="parent" basedir=".">
<import file="child.xml"/>
<target name="parent-target">
    <child-macro myid="test"/>
    <echo message="(From Parent) ${child-property}" />
</target>

<强> child.xml

<?xml version="1.0" encoding="UTF-8"?>
<project name="child" basedir=".">
<macrodef name="child-macro">
    <attribute name="myid" default=""/>
    <sequential>
        <property name="child-property" value="i am child value" />
        <echo message="(From Child) ${child-property}" />
        <echo message="Received params: myId=@{myid}"/>
    </sequential>
</macrodef>
</project>

<强>输出

parent-target:
 [echo] (From Child) i am child value
 [echo] Received params: myId=test
 [echo] (From Parent) i am child value

答案 2 :(得分:1)

Ant-contrib的runtarget任务已经足以解决我的问题。它迁移不适合其他人,因为它在父母的上下文中运行目标。猜想在Ant正式支持变量之前,对于这些问题没有“一个解决方案”。

<project name="parent" basedir=".">
    <!-- insert necessary antcontrib taskdef here-->
    <include file="child.xml" />
    <target name="parent-target">
        <var name="x" value="x"/>
        <runtarget target="child.child-target"/>
        <echo message="From Parent: ${x}"/>
    </target>
</project>

<project name="child" basedir=".">
    <property name="pre" value="childpre" />
    <target name="child-target">
        <var name="x" value="${x}y" />
    </target>
</project>

输出

parent-target:

child.child-target:
     [echo] From Parent: xy