我有一组文件,我在一个蚂蚁构建中,我想要分成相同大小的子集.
在不添加自定义任务的情况下,在Ant中执行此操作的简单方法是什么.
例:
文件集包含
TestOne.java
TestTwo.java
TestThree.java
TestFour.java
TestFive.java
TestSix.java
Run Code Online (Sandbox Code Playgroud)
我想要3个文件集
Fileset1
TestOne.java
TestTwo.java
Run Code Online (Sandbox Code Playgroud)
Fileset2
TestThree.java
TestFour.java
Run Code Online (Sandbox Code Playgroud)
Fileset3
TestFive.java
TestSix.java
Run Code Online (Sandbox Code Playgroud)
假设文件的顺序并不重要,并且当您说没有自定义任务时,您不会排除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>
Run Code Online (Sandbox Code Playgroud)
鉴于您引用的六个文件,上面给出:
scr:
[echo] Set 1: TestFive.java;TestFour.java
[echo] Set 2: TestOne.java;TestSix.java
[echo] Set 3: TestThree.java;TestTwo.java
Run Code Online (Sandbox Code Playgroud)
我没有想出一个纯粹的蚂蚁方式来实现这一目标.您可以考虑使用ant-contrib,它是一组相当广泛使用的扩展,适用于循环和可变属性.
最终评论,对于您的示例集,您可以获得所需的效果,但它不会超出三个Fileset.使用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>
Run Code Online (Sandbox Code Playgroud)