ant copy 复制命令

ant copy copying order

我是ant新手,想知道ant副本是如何决定复制顺序的。问题是,我有一个像这样的文件夹结构 releases/v1,v2,v3 。将为每个新版本创建文件夹。这些文件夹中的文件名和名称相似。并且需要将最新版本复制到名为 'latest' 的文件夹中,在这种情况下,需要将 v3 复制到 'latest' 中。所以我的逻辑是将一个一个复制到'latest'文件夹中并覆盖文件,最新的文件将保留在最后。我的代码是这样的。

 <copy todir="${srcdist.layout.dir}/etc/wsdl/latest"  flatten="true" overwrite="true">
 <fileset dir="../../releases">             
 <include name="**/*.wsdl"/>        
 </fileset>
 </copy>

这段代码对我来说工作正常(在 centOS 中)。它从 v1 开始复制并在 v3 结束。但我怀疑这个复制顺序是否每次都有效。 copy todir 在复制之前对文件夹名称进行排序吗?请帮我。

我认为在复制时依靠 <fileset> 排序文件的方式是不好的。因此,如果您可以尝试更改此逻辑以使用 TimestampSelector from the Ant-Contrib project 到 select 最新的 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 to get the latest file. Here you can find an example

使用排序

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

来自 Ant 文档中的 Path-like Structures

...certain resource collection types such as fileset, dirset and files are undefined in terms of order.

因此,您不能依赖于维护任何顺序的文件集。

相反,您可以使用 JavaScript 来查找 "latest" 发布目录:

<!-- 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 releases\v10\v10.wsdl to my-out-dir\v10.wsdl