Как разбить набор файлов в Ant на несколько наборов

У меня есть набор файлов, которые я собираю в сборке муравьев, которые я хочу разделить на подмножества равного размера.

Какой хороший простой способ сделать это в Ant без добавления пользовательских задач.

Пример:

Набор файлов содержит

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

Я хотел бы 3 набора файлов

Набор файлов1

TestOne.java
TestTwo.java

Набор файлов2

TestThree.java
TestFour.java

Набор файлов3

TestFive.java
TestSix.java

person John Sonmez    schedule 03.03.2010    source источник


Ответы (1)


Предполагая, что порядок файлов не важен, и когда вы говорите, что нет настраиваемых задач, вы не исключаете ant скрипт, может подойти что-то, полученное на его основе.

<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-contrib, который представляет собой довольно широко используемый набор расширений, предназначенных для циклических и изменяемые свойства.

Заключительный комментарий, для вашего примера набора вы можете получить желаемый эффект, но он не будет выходить за рамки трех наборов файлов. Использует first и last коллекции ресурсов.

<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>
person martin clayton    schedule 04.03.2010
comment
Я пытался избежать использования javascript, но, думаю, выхода нет? - person John Sonmez; 05.03.2010
comment
@John Не могу придумать чистое решение для муравьев. Добавили еще пару идей. - person martin clayton; 05.03.2010
comment
подождите, вы можете поместить javascript в скрипт муравья? Что это за колдовство? - person Hoffmann; 22.01.2013