我是ant的新手,我想知道ant副本是如何决定复制顺序的。问题是,我有一个像releases/v1,v2,v3
这样的文件夹结构。将为每个新版本创建文件夹。并且在这些文件夹中文件的名称将是相似的。并且需要将最新版本复制到名为"最新"的文件夹中。在这种情况下,需要将v3复制到"最新的"中。所以我的逻辑是一个接一个地复制到"最新"文件夹中,并覆盖这些文件,最新的文件将保留在最后。我的代码是这样的。
<copy todir="${srcdist.layout.dir}/etc/wsdl/latest" flatten="true" overwrite="true">
<fileset dir="../../releases">
<include name="**/*.wsdl"/>
</fileset>
</copy>
这个代码对我来说很好(在centOS中(。它从v1开始复制,到v3结束。但我对这份复印单感到怀疑,怀疑它是否每次都有效。复制前是否对文件夹名称进行排序?请帮帮我。
我认为在复制时依赖<fileset>
对文件的排序方式是不好的。因此,如果您可以尝试更改此逻辑,使用Ant-Contrib项目中的TimestampSelector来选择最新的wsdl文件,并仅复制此文件,而不是所有版本的所有文件,也许会更好。可以这样做:
<timestampselector property="latest.modified">
<path>
<fileset dir="../../releases">
<include name="**/*.wsdl" />
</fileset>
</path>
</timestampselector>
<copy todir="${srcdist.layout.dir}/etc/wsdl/latest" file="${latest.modified}"/>
或者,自Ant 1.7.1以来,您可以使用Last来获取最新的文件。在这里你可以找到一个例子。
来自Ant文档中的类路径结构:
某些资源集合类型,如文件集、目录集和文件在顺序上未定义。
因此,您不能依赖文件集来维护任何顺序。
相反,您可以使用JavaScript来查找"最新"的发布目录:
<!-- match directories starting with "v" under the "releases" directory -->
<dirset id="release.dirs" dir="releases" includes="v*"/>
<script language="javascript">
<![CDATA[
var dirSet = project.getReference( "release.dirs" );
var ds = dirSet.getDirectoryScanner( project );
var includes = ds.getIncludedDirectories();
var greatestVersion = 0;
for ( var i = 0; i < includes.length; i++ )
{
var dirname = includes[i];
// chop off the "v" from the front
var dirVersion = dirname.substr(1);
greatestVersion = Math.max( greatestVersion, dirVersion );
}
project.setProperty( "greatestVersion", greatestVersion );
]]>
</script>
<copy todir="my-out-dir" verbose="true">
<fileset dir="releases/v${greatestVersion}" includes="**/*.wsdl"/>
</copy>
为了测试脚本,我在一个releases
目录下创建了几个v#
目录。每个目录都有一个*.wsdl
文件。
$ ls -R releases/
releases/:
v1 v10 v2 v3
releases/v1:
v1.wsdl
releases/v10:
v10.wsdl
releases/v2:
v2.wsdl
releases/v3:
v3.wsdl
运行脚本的输出:
run:
...
[copy] Copying releasesv10v10.wsdl to my-out-dirv10.wsdl
使用排序
<copy todir="${srcdist.layout.dir}/etc/wsdl/latest" flatten="true" overwrite="true">
<sort>
<fileset dir="../../releases">
<include name="**/*.wsdl"/>
</fileset>
</sort>
</copy>