具有嵌套任务的Ant属性集继承

时间:2010-08-26 08:43:05

标签: ant build-process build-automation

我有一组嵌套的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

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="..."/>此文件。