如何在Ant中将文件集拆分为多个集合

6

我有一组文件要在Ant构建中使用,我想把它们分成相等大小的子集。

在不添加自定义任务的情况下,在Ant中如何简单有效地完成此操作?

示例:

Fileset 包含以下内容:

TestOne.java
TestTwo.java
TestThree.java
TestFour.java
TestFive.java
TestSix.java

我需要三个文件集。

文件集1

TestOne.java
TestTwo.java

Fileset2
TestThree.java
TestFour.java

文件集3

TestFive.java
TestSix.java
1个回答

9
假设文件的顺序不重要,并且当您说没有自定义任务时,您并没有排除ant script任务,那么从这个任务派生出来的东西可能是合适的。
<fileset id="Fileset" dir="${basedir}" includes="Test*.java" />

<target name="scr">
    <script language="javascript">
    <![CDATA[
        // Obtain a reference to fileset in the enclosing project
        var fileSet = project.getReference( "Fileset" );

        // Now get matching files.
        var ds = fileSet.getDirectoryScanner( project );
        var includes = ds.getIncludedFiles( );

        var batchSize = 2;
        var batch = 1;
        for ( var i = 0; i < includes.length; i += batchSize )
        {
            // Create a new fileset to hold the sub-Fileset.
            var filesetN = project.createDataType( "fileset" );
            filesetN.setDir( fileSet.getDir( ) );

            // Give the new Fileset an id and associate with the project.
            project.addReference( "Fileset" + batch, filesetN );

            // Populate the sub-Fileset.
            for ( var j = 0; j < batchSize && ( i + j ) < includes.length; j++ )
            {
                filesetN.setIncludes( includes[i + j] );
            }

            batch++;
        }
    ]]>
    </script>

    <!-- Just to illustrate. -->
    <echo message="Set 1: ${toString:Fileset1}" />
    <echo message="Set 2: ${toString:Fileset2}" />
    <echo message="Set 3: ${toString:Fileset3}" />
</target>

考虑到你引用的六个文件,上述代码会给出:

scr:
     [echo] Set 1: TestFive.java;TestFour.java
     [echo] Set 2: TestOne.java;TestSix.java
     [echo] Set 3: TestThree.java;TestTwo.java

我还没有想出一种纯粹的Ant方法来实现这一点。您可以考虑使用ant-contrib,它是一个相当广泛使用的扩展集,可满足循环和可变属性的需求。
最后的评论,对于您的示例集,您可以获得所需的效果,但它不会延伸到三个文件集之外。使用firstlast资源集合
<target name="reso">
    <first id="Fileset1" count="2">
        <fileset refid="Fileset" />
    </first>
    <last id="Fileset3" count="2">
        <fileset refid="Fileset" />
    </last>
    <difference id="Fileset2">
        <resources refid="Fileset" />
        <resources refid="Fileset1" />
        <resources refid="Fileset3" />
    </difference>
</target>

我本来想避免使用JavaScript的,但是看来没有别的办法了吗? - John Sonmez
@John 想不出一个纯粹的蚂蚁解决方案。已经提出了另外几个想法。 - martin clayton
2
等等,你可以在Ant脚本中放置JavaScript?这是什么神奇的魔法? - Hoffmann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接