使用Ant组合文件集

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Ant组合文件集相关的知识,希望对你有一定的参考价值。

我在Ant中定义了两个不同的文件集,如下所示:

<fileset id="fileset1" dir="${classes.dir}">
</fileset>

<zipfileset id="fileset2" src="myArchive.zip" includes="**/*.class">
</zipfileset>

我想创建第三个文件集,它是上述两个文件集的并集

<fileset id="merged">
</fileset>

谁能告诉我怎么做?甚至可以做那样的事情吗?提前致谢!

答案

一种方法是使用Ant resource collections,特别是union

<fileset id="fileset1" dir="${classes.dir}" />
<zipfileset id="fileset2" src="myArchive.zip" includes="**/*.class" />

<union id="onion">
    <resources refid="fileset1" />
    <resources refid="fileset2" />
</union>

然后,您可以在任何可能使用文件集的地方参考“洋葱”,例如

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

我建议使用通用的resources元素而不是文件集以获得最大的灵活性。

另一答案

试试这个:我认为它应该有效,因为<fileset>是隐含的<patternset>

<fileset id="fileset1" dir="${classes.dir}">
</fileset>

<zipfileset id="fileset2" src="myArchive.zip" includes="**/*.class">
</zipfileset>

编辑:奇怪。这或许呢?

<patternset id="merged">
  <patternset refid="fileset1" />
  <patternset refid="fileset2" />
</patternset>
另一答案

fileset的问题是,它需要一个目录作为基础,它应用了模式集。这意味着您必须找到所有文件集共享的公共基目录。

<pathconvert>任务可以通过refid获取文件集。您可以放置​​多个文件集(例如,来自各种构建目标,以在模块化构建环境的根/主目标中组合化合物集):


<project name="root" basedir="." xmlns:if="ant:if" xmlns:unless="ant:unless">
<!-- 
it's important to take the xmlns:features in your project head 
otherwhise this code won't work 
-->
    <target name="init">
        <!-- set some common prerequisites -->
        <property name="prerequisite.property.xyz" value="xyz" />
    </target>

    <target name="targetA" depends="init">
        <fileset dir="${common.basedir}${file.separator}${targetA.subdir}" id="targetA.fileset">
            <include name="**/*.html" />
        </fileset>
        <property name="targetA.fileset.exists" value="true" />
    </target>

    <target name="targetB" depends="init">
        <fileset dir="${common.basedir}${file.separator}${targetB.subdir}" id="targetB.fileset">
            <include name="**/*.java" />
        </fileset>
        <property name="targetB.fileset.exists" value="true" />
    </target>

    <target name="targetC" depends="init">
        <fileset dir="${common.basedir}${file.separator}${targetC.subdir}" id="targetC.fileset">
            <include name="**/*.class" />
        </fileset>
        <property name="targetC.fileset.exists" value="true" />
    </target>

    <target name="root" depends="init">
        <pathconvert property="all.files.as.commaseparated.path" pathsep="," dirsep="/">
            <fileset refid="targetA.fileset" if:true="${targetA.fileset.exists}" />
            <fileset refid="targetB.fileset" if:true="${targetB.fileset.exists}" />
            <fileset refid="targetC.fileset" if:true="${targetC.fileset.exists}" />
            <map from="${common.basedir}/" to="" />
        </pathconvert>
        <!-- assemble new fileset from paths as comma separated property string -->
        <fileset id="new.refid" dir="${common.basedir}" includes="${all.files.as.commaseparated.path}" />
    </target>
</project>

这可以通过命令行调用,如:

ant targetA targetB targetC root

要么

ant targetA root

请注意,root始终是被调用的最后一个目标。

以上是关于使用Ant组合文件集的主要内容,如果未能解决你的问题,请参考以下文章

创建一个 ANT 宏来组合两个属性文件

如何在最新的 Ant 命令中使用文件列表作为文件集?

NDK: ant 错误 [javah] Exception in thread "main" java.lang.NullPointerException 多种解决办法(代码片段

将 ant 文件集回显到屏幕以进行调试

解决未能加载文件或程序集“Newtonsoft.Json ...."或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)(代码片段

如何解析 MPD 清单视频文件并获取图像适配集的片段?