【问题标题】:How to split an fileset in Ant into multiple sets如何将 Ant 中的文件集拆分为多个集
【发布时间】:2010-03-03 17:42:37
【问题描述】:

我有一组要在 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

【问题讨论】:

    标签: ant split fileset


    【解决方案1】:

    假设文件的顺序并不重要,并且当您说没有自定义任务时,您并没有排除 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-contrib,它是一组相当广泛使用的扩展,可满足循环和可变属性的需求。

    最后的评论,对于您的示例集,您可以获得所需的效果,但它不会超出三个文件集。使用firstlast 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>
    

    【讨论】:

    • 我试图避免使用 javascript,但我想没有办法?
    • @John 想不出一个纯粹的蚂蚁解决方案。添加了一些其他想法。
    • 等等,你能把javascript放在一个ant脚本里吗?这是什么魔法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多