一、概述
copy是Ant内置任务,用于将文件或资源集合拷贝到一个新的文件或者目录。默认情况下,只有源文件比目标文件更新或者目标文件不存在时才会拷贝,但是可以使用overwrite属性来覆盖文件。资源集合用于选择一组要拷贝的文件,使用资源集合时,必须设置todir属性。有一些资源返回绝对路径作为名字,比如file,使用它们但是不使用flatten属性或者内嵌mapper的话,得到的结果可能会与预期不一致。如果在复制操作中使用了过滤器,需要限制副本为文本文件。二进制文件会被复制操作损坏,无论通过filter隐式的定义过滤器还是显示的filterset都是如此。此外copy还支持filterchain元素,当filterchain与filterset同时出现时,所有的filterchain优先于filterset处理。
二、属性
file:要拷贝的文件。
preservelastmodified:是否将拷贝文件的最后修改时间设置为源文件的最后修改时间,默认为false。
tofile:拷贝到的文件位置。
todir:拷贝到的目录。
overwrite:即使目标文件比源文件更新也会覆盖目标文件,默认为false。
force:从Ant1.8.2起,即使目标文件是只读的也会覆盖文件,默认为fale。
filtering:在进行拷贝时是否使用全局的构建文件过滤器。即使没有设置这个属性或者设置为false,使用嵌套的filterset时也会使用全局的构建文件过滤器。默认为false。
flatten:是否忽略源文件的目录结构,将所有文件拷贝到todir属性指定的目录下。可以使用flatten mapper达到同样的效果。默认为false。
includeEmptyDirs:是否拷贝fileset中的空目录。默认为true。
failonerror:如果为false,当文件不存在或者指向一个目录嵌套的fileset不存在,或者拷贝发生异常时,会记录一个警告信息,但不会停止构建,默认为true。
quiet:从Ant1.8.3起,如果failonerror属性设置为false,当文件不存在或者指向一个目录嵌套的fileset不存在,或者拷贝发生异常时,如果quiet为true不会记录警告信息。默认为false。
verbose:是否记录正在拷贝的文件,默认为false。
encoding:从Ant1.5起,设置拷贝文件的编码,默认为JVM编码格式。
outputencoding:从Ant1.6起,设置写文件时的编码,如果设置encoding属性,默认与encoding属性相同,否则与JVM编码格式相同。
enablemultiplemappings:从Ant1.6起,是否处理所有源路径映射,如果为true,处理所有映射,如果为false,则只处理第一个文件或目录。这个属性只有在存在mapper子元素时才有效。默认为false。
granularity: 因为不是每个文件系统都支持将修改时间精确到毫秒,所以从Ant1.6.2起,可以设置修改时间允许的时间误差。默认是1秒,DOS系统是2秒。
当使用file属性时,tofile与todir属性都可以使用;对于内嵌资源集合元素,如果包含的资源大于1,或者fileset中只定义了dir属性,或者指定了file属性,那么只能使用todir属性。在Apache Ant 1.8.2之前,tofile属性只支持文件系统资源的顶级拷贝。
三、简单示例
<project>
<copy file="build.xml" tofile="build1.xml"/>
<copy file="build1.xml" todir="./new"/>
<copy todir="../tmpcopy">
<fileset dir="."/>
</copy>
<copy todir="afterfilter">
<fileset dir="." includes="*.txt"/>
<filterset>
<filter token="build" value="tmp"/>
</filterset>
</copy>
</project>