Ant 是否保证文件集的顺序?

Does Ant guarantee order of filesets?

在我们的项目中,我们使用 Ant 来分发文件。文件有层次结构,它们会覆盖上一层的文件。像这样:默认 - level1 - level2。目前制作方式:

<copy todir="...">
 <fileset dir="${root}/default" includes="**/*" excludes="file1" />
 <fileset dir="${root}/level1" includes="**/*" />
 <fileset dir="${root}/level2" includes="**/*" excludes="file2"/>
</copy>

所以我们预计所有文件夹都包含同名文件,它将从 level2 目录中获取。

不久前,我们使用另一个版本 Java 移动到一个新的构建框,我们发现文件集的顺序被破坏了。

有没有办法在不修改 ant 配置文件的情况下解决这个问题?我们有很多。如果没有办法,我怎么能便宜到手呢?谢谢。

我不知道文件集的顺序是否有保证,但是复制任务的顺序是有保证的。 所以,按照 this answer 的建议,写几个复制任务可能是个好主意 overwrite="true":

<copy todir="...">
  <fileset dir="${root}/default" includes="**/*" excludes="file1" />
</copy>
<copy todir="...">
  <fileset dir="${root}/level1" includes="**/*" overwrite="true" />
</copy>
<copy todir="...">
  <fileset dir="${root}/level2" includes="**/*" excludes="file2" overwrite="true" />
</copy>

您可以将 sort 资源集合包裹在您的 fileset 周围,并确保以这种方式复制所使用的顺序。排序本身只喜欢将单个资源集合作为子元素,因此您需要将 fileset 包装在 unionresources 容器中。

http://ant.apache.org/manual/Types/resources.html#sort

类似

<sort>
  <resources>
    <fileset dir="${root}/default" includes="**/*" excludes="file1" />
    <fileset dir="${root}/level1" includes="**/*" />
    <fileset dir="${root}/level2" includes="**/*" excludes="file2"/>
  </resources>
  <name/>
</sort>

按名称对文件排序。