我正在尝试使用ant的include或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}
<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}
如何从父母那里获取“儿童财产”?
答案 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