【问题标题】:ant copy copying orderant copy 复制命令
【发布时间】:2015-09-22 12:02:25
【问题描述】:

我是 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 结束。但我怀疑这个复制顺序是否每次都有效。复制前是否对文件夹名称进行排序?请帮我。

【问题讨论】:

    标签: ant build-automation


    【解决方案1】:

    我认为在复制时依赖&lt;fileset&gt; 如何对文件进行排序并不好。因此,如果您可以尝试更改此逻辑以使用Ant-Contrib project 中的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 来获取最新文件。在这里您可以找到example

    【讨论】:

    • 感谢您的回复。根据我的要求,我无法根据修改或创建日期对其进行排序,因为这些文件夹可能会被修改以向老用户提供支持服务。我需要按文件夹名称对其进行排序。我已经修改了代码。你能告诉我好吗?
    • 是的,那么您需要对它们进行排序,以确保按顺序排列。您的示例似乎很好,只需将 iclud 名称更改为预览版本,然后它将包含子目录中的所有文件
    【解决方案2】:

    来自 Ant 文档中的 Path-like Structures

    ...某些资源集合类型,例如文件集、目录集和文件 在顺序方面未定义。

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

    相反,您可以使用 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 releases\v10\v10.wsdl to my-out-dir\v10.wsdl
    

    【讨论】:

      【解决方案3】:

      使用排序

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

      【讨论】:

      • 如果您进入版本 10,这可能会导致问题,因为在基于 ASCII 的排序中,“10”介于“1”和“2”之间。例如:1, 2, 3, ..., 10, 11 将被排序为 1, 10, 11, 2, 3, ...
      • @Chad Nouis。谢谢。那么如何按目录名排序呢?因为我无法按修改或创建日期对其进行排序。因为旧版本可能会被支持人员更改。
      • 看看我刚刚发布的答案。
      猜你喜欢
      • 2013-03-20
      • 2021-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多