我有一个像这样的文件夹结构:
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
相反,如何将Ant复制为:
v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11
答案 0 :(得分:3)
Ant正确排序,因为v10
按字典顺序排在v2
之前(排序比较器逐个比较字符)。
为了在v2
之前v11
,您必须编写自定义比较器(documentation中的内置比较器列表是不够的)。换句话说,您必须编写一个实现org.apache.tools.ant.types.resources.comparators.ResourceComparator
类的类,将您的类添加到类路径中并在Ant脚本中将其声明为typedef:
<typedef name="my_custom_sort" classname="com.example.MyCustomResourceComparator" />
答案 1 :(得分: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/v@{version}" includes="**/*.wsdl"/>
</copy>
</sequential>
</for>