2015-09-24 235 views
3

我有一个文件夹结构是这样的:排序文件集数字在蚂蚁

wsdl/v1,----,v11 

我需要它的所有文件复制到一个名为“latestVersion”新的文件夹,我需要从V1维持复制顺序V11。所以要做到这一点,我需要在复制时按名称对目录进行排序。我的代码是这样的:

<copy todir="${srcdist.layout.dir}/etc/wsdl/latestVersion" flatten="true" overwrite="true" verbose="true"> 
    <sort> 
     <fileset dir="../../sdk/etc/wsdl"> 
      <include name="**/*.wsdl"/> 
     </fileset> 
    </sort> 
</copy> 

我想复制从v1开始,并在V11结束。然而,它复制这样的:

v1,v10,v11,v2,v3,v4,v5,v6,v7,v8,v9 

如何,相反,我能得到蚂蚁复制,如:

v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11 

回答

2

您可以使用嵌入在Ant脚本JavaScript来数字排序目录名称。

然后,您可以使用<for> task从第三方Ant-Contrib library从分类目录一次一个复制:

<dirset id="wsdl.dirs" dir="../../sdk/etc/wsdl" includes="v*"/> 
<script language="javascript"> 
<![CDATA[ 
    var dirSet = project.getReference("wsdl.dirs"); 
    var ds = dirSet.getDirectoryScanner(project); 
    var includes = ds.getIncludedDirectories(); 
    var versions = []; 
    for (var i = 0; i < includes.length; i++) { 
     var dirname = includes[i] 
     // chop off the "v" from the front 
     var dirVersion = dirname.substr(1); 
     versions.push(dirVersion); 
    } 
    versionsSorted = versions.sort(function (a, b) { 
     return a - b; 
    }); 
    // the "list" of <for> takes a comma-delimited string 
    project.setProperty("versions", versionsSorted.join(',')); 
]]> 
</script> 
<echo>sorted versions: ${versions}</echo> 

<for list="${versions}" param="version"> 
    <sequential> 
     <copy todir="${srcdist.layout.dir}/etc/wsdl/latestVersion"> 
      <fileset dir="../../sdk/etc/wsdl/[email protected]{version}" includes="**/*.wsdl"/> 
     </copy> 
    </sequential> 
</for> 
2

蚂蚁正确排序,因为v10v2字典序之前(排序比较器字符逐个)。

为了在v11之前拥有v2您必须编写自定义比较器(documentation中的内置比较器列表不够)。换句话说,你必须写一个实现org.apache.tools.ant.types.resources.comparators.ResourceComparator类的类,类添加到类路径,并宣布它作为一个typedef在Ant脚本:

<typedef name="my_custom_sort" classname="com.example.MyCustomResourceComparator" />