首页 文章

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

提问于
浏览
0

我的 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 ,但我得到的消息是这些任务"don't support the nested [name of macrodef] element" . 所以我想Ant中的 macrodef 只能用作高级任务,不能在任意位置扩展 .

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

1 回答

  • 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>
    

相关问题