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
我是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