我知道我可以<exec executable="cp" failonerror="true">
,但是,我真的更希望有一个任务,我可以从任何可以使用copy
的所有(或至少大部分)属性的操作系统调用,但不会占用unix上的权限。
我想知道是否已经有了解决方案,或者我是否必须编写自己的copy2
。
因为我有点害怕,没有什么"现成的"。我们有这段代码,但它只处理目录到目录的复制或文件到文件的复制,具有自定义属性,并且不做复制所做的任何其他整洁的事情。
<!-- ==================================================================== -->
<!-- Copy files from A to B -->
<!-- <copy> would do this job, if it weren't such a useless pile of fail -->
<!-- and could manage to preserve execute bits on Linux -->
<!-- ==================================================================== -->
<macrodef name="internal-copydir">
<attribute name="fromdir" default="NOT SET" />
<attribute name="todir" default="NOT SET" />
<sequential>
<if>
<os family="windows" />
<then>
<copy todir="@{todir}">
<fileset dir="@{fromdir}" />
</copy>
</then>
<else>
<exec executable="rsync" failonerror="true">
<arg value="-a" />
<arg value="@{fromdir}/" />
<arg value="@{todir}/" />
</exec>
</else>
</if>
</sequential>
</macrodef>
<!-- ==================================================================== -->
<!-- Copy file from A to B -->
<!-- <copy> would do this job, if it weren't such a useless pile of fail -->
<!-- and could manage to preserve execute bits on Linux -->
<!-- ==================================================================== -->
<macrodef name="internal-copyfile">
<attribute name="file" default="NOT SET" />
<attribute name="tofile" default="NOT SET" />
<sequential>
<if>
<os family="windows" />
<then>
<copy file="@{file}" tofile="@{tofile}"/>
</then>
<else>
<exec executable="cp" failonerror="true">
<arg value="@{file}" />
<arg value="@{tofile}" />
</exec>
</else>
</if>
</sequential>
</macrodef>
这也是我写的。
<!-- ==================================================================== -->
<!-- Copy file to a directory -->
<!-- <copy> would do this job, if it weren't such a useless pile of fail -->
<!-- and could manage to preserve execute bits on Linux -->
<!-- ==================================================================== -->
<macrodef name="internal-copyfiletodir">
<attribute name="file" default="NOT SET" />
<attribute name="todir" default="NOT SET" />
<sequential>
<if>
<os family="windows" />
<then>
<copy file="@{file}" todir="@{todir}"/>
</then>
<else>
<exec executable="cp" failonerror="true">
<arg value="@{file}" />
<arg value="@{todir}/" />
</exec>
</else>
</if>
</sequential>
</macrodef>
我不知道有一个。正如Ant文档中提到的,这是因为JRE中没有操作文件权限的机制。Ant Copy任务
Java7为这类事情提供了更好的支持,所以也许在Ant的未来版本中,这将是可能的。这可能需要很长时间,因为我认为Ant只会迁移到Java 5的1.9版本。
我想你可能能够通过有条件地运行基于操作系统的操作系统特定命令来模拟你想要的行为?
这并不理想,但有一个"chmod"任务可以用来设置"副本"或"复制目录"后每个文件的权限:
http://ant.apache.org/manual/Tasks/chmod.html