我有一组嵌套的Ant构建文件,我需要控制每个“子”任务继承哪些属性。我试图将这些定义为属性集(以保持代码可管理)但这些不是由子任务继承的,与属性不同。
下面的示例演示了问题,foo.*
被复制到中间项目,但没有复制到底层项目。如果我将每个属性定义为显式继承,如bar.*
,它们也会被底层项目继承。
有没有办法让一组属性一直继承下来,就像个别属性一样?如果不重写子流程,我还能尝试一些其他的东西吗?
[top.xml]
<?xml version="1.0"?>
<project name="test-top">
<property name="foo.1" value="1"/>
<property name="foo.2" value="2"/>
<property name="bar.1" value="1"/>
<property name="bar.2" value="2"/>
<ant antfile="middle.xml" inheritall="false">
<propertyset>
<propertyref prefix="foo."/>
</propertyset>
<property name="bar.1" value="${bar.1}"/>
<property name="bar.2" value="${bar.2}"/>
</ant>
</project>
[middle.xml]
<?xml version="1.0"?>
<project name="test-middle">
<echo>foo ${foo.1} ${foo.2}</echo>
<echo>bar ${bar.1} ${bar.2}</echo>
<ant antfile="bottom.xml" inheritall="false"/>
</project>
[bottom.xml]
<?xml version="1.0"?>
<project name="test-bottom">
<echo>foo ${foo.1} ${foo.2}</echo>
<echo>bar ${bar.1} ${bar.2}</echo>
</project>
[ant -f top.xml的输出]
[echo] foo 1 2
[echo] bar 1 2
[echo] foo ${foo.1} ${foo.2}
[echo] bar 1 2
答案 0 :(得分:2)
我认为亚历山大的解决方案很接近。但是这个怎么样,不需要在middle.xml或bottom.xml中进行任何更改。
我们的想法是使用echoproperties
任务将属性集“展开”到各个属性,然后在ant
任务调用中使用它。
在调用middle.xml之前,请使用以下内容编写属性:
<echoproperties destfile="myproperties.txt">
<propertyset>
<propertyref prefix="foo."/>
<propertyref prefix="bar."/>
</propertyset>
</echoproperties>
然后调用middle.xml:
<ant antfile="middle.xml" inheritall="false">
<property file="myproperties.txt" />
</ant>
如您所说,提供给ant任务inherit all the way down的属性,因此您只需要更改top.xml:
这些属性相当于 您在命令上定义的属性 线。这些都是特殊的属性 他们总是会被传下来,甚至 通过额外的&lt; ant &gt;任务 inheritall设置为false(见上文)。
答案 1 :(得分:1)
在top.xml中,您可以使用<propertyfile>
任务创建具有可继承属性的文件。
然后,您可以在每个子模块中加载<property file="..."/>
此文件。