如何重用多个文件集的定义?

时间:2015-02-20 11:50:15

标签: ant

我的build.xml中有许多任务都使用相同的文件集。例如。类似下面的内容(我保留了与cobertura覆盖工具相关的任务的实际名称 - 但包络任务的性质对于这个问题并不重要。)

<target name="coverage-report">
    <cobertura:cobertura-report destdir="${coverage.xml.dir}" format="xml">
        <fileset dir="${src.dir}">
            <include name="**/*.java" />
        </fileset>
        <fileset dir="${componentFoo.dir}/src">
            <include name="**/*.java" />
        </fileset>
    </cobertura:cobertura-report>
</target>

<target name="summary-coverage-report">
    <cobertura:cobertura-report destdir="${coverage.summaryxml.dir}" format="summaryXml">
        <fileset dir="${src.dir}">
            <include name="**/*.java" />
        </fileset>
        <fileset dir="${componentFoo.dir}/src">
            <include name="**/*.java" />
        </fileset>
    </cobertura:cobertura-report>
</target>

<target name="alternate-coverage-report">
    <cobertura:cobertura-report destdir="${coverage.html.dir}">
        <fileset dir="${src.dir}">
            <include name="**/*.java"/>
        </fileset>
        <fileset dir="${componentFoo.dir}/src">
            <include name="**/*.java" />
        </fileset>
    </cobertura:cobertura-report>
</target>

我想要做的是能够定义一次这个重复出现的文件集并重用它。现在,有一个关于如何在多个地方使用相同文件集的相关SO question但由于我有多个文件集而不是一个文件集,因此不能在这里工作。我还尝试将文件集包装在macrodef内并在需要时展开macrodef,但我得到的消息是这些任务&#34;不支持嵌套的[macrodef名称]元素& #34 ;.所以我想Ant中的macrodef只能用作高级任务,不能在任意位置扩展。

那么有没有办法在Ant中重用多个文件集的定义?

1 个答案:

答案 0 :(得分:2)

如果cobertura任务接受任意资源集合而不是硬编码到fileset,这将很容易 - 为此可能值得提交功能请求。例如,使用copy任务:

<resources id="filesets">
    <fileset dir="${src.dir}">
        <include name="**/*.java" />
    </fileset>
    <fileset dir="${componentFoo.dir}/src">
        <include name="**/*.java" />
    </fileset>
</resources>


<copy todir="dest">
    <resources refid="filesets"/>
</copy>

您可以回退到纯XML级别并使用实体引用:

<!DOCTYPE project [
  <!ENTITY cobFilesets '<fileset dir="${src.dir}">
        <include name="**/*.java" />
    </fileset>
    <fileset dir="${componentFoo.dir}/src">
        <include name="**/*.java" />
    </fileset>'>
]>
<project ....>
    <target name="coverage-report">
        <cobertura:cobertura-report destdir="${coverage.xml.dir}" format="xml">
          &cobFilesets;
        </cobertura:cobertura-report>
    </target>
</project>