开发者

How to split an fileset in Ant into multiple sets

I have a set 开发者_高级运维of files that I am picking up in an ant build, which I want to split into equal sized sub sets.

What is a good simple way to do this in Ant without adding custom tasks.

Example:

Fileset contains

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

I would like 3 filesets

Fileset1

TestOne.java
TestTwo.java

Fileset2

TestThree.java
TestFour.java

Fileset3

TestFive.java
TestSix.java


Assuming that the order of the files is not important, and when you say no custom tasks you're not excluding the ant script task, something derived from this might be suitable.

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

Given the six files you quote, the above gives:

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

I haven't come up with a pure ant way to achieve this. You might consider ant-contrib which is a fairly widely-used set of extensions that caters for looping and mutable properties.

Final comment, for your example set you can get the desired effect, but it won't extend beyond three Filesets. Uses the first and last resource collections.

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜