我正在处理一个大的 Ant 脚本(> 1000 行),这是我从其他人那里继承的(不再可用)。我在 Ant 不删除目录时遇到问题。在脚本中的某一点,它有效,在另一点,它不起作用:Ant 不会给出错误消息,但它也会将目录留在它们所在的位置。
我在它周围放了一些时髦的东西,以检查目录是否存在:
<groovy>
println("Directories in @{outFolder} are:")
new File("@{outFolder}").eachDir() { dir -> println dir.getName() }
</groovy>
<delete verbose="true" includeEmptyDirs="true" >
<dirset dir="@{outFolder}" includes="**/*" />
</delete>
<echo>End of delete</echo>
<groovy>
println("Directories in @{outFolder} are:")
new File("@{outFolder}").eachDir() { dir -> println dir.getName() }
</groovy>
因此,这些行被调用并且它们起作用。接下来,调用其他一些应用程序,以创建新目录。再次调用完全相同的行(复制和粘贴,是的,它们是相等的),但现在目录不会被删除。另外:没有错误,蚂蚁继续运行。我在 Windows Server 2008 R2 上使用 Ant 1.8.1。我尝试添加睡眠,以防止锁定问题。创建目录的应用程序是Java应用程序(Tibco appManage)。这些目录包含 XML 文件,没有 jar 文件。我检查了ANT_HOME和类路径:那里没有问题。我错过了什么?
对于聪明的驴子:当然,第二次删除不应该删除应用程序创建的所有内容,但为了确定问题,我使脚本行尽可能简单。
更多信息:由于我无法使删除工作,因此我尝试使用Ant move作为解决方法。这就是我所看到的:移动在目标处创建空目录,不会从源中删除任何文件或目录,也不会报告错误。这些源目录/文件似乎有问题(我之前尝试删除过)。
另一个尝试:下载最新版本的Ant和Groovy。相同的结果。
您使用的是目录。 使用文件集。
解释:目录不是你想象的那样。 您几乎总是希望使用文件集。
第一次,它正在工作,因为目录是空的。第二次,他们不是。我可以说这是因为<dirset>
包含目录对象本身,但没有其中的任何文件,并且您在删除任务中使用"includeEmptyDirs",这对于目录集毫无意义。
在这样的假设树中:
top/
sub1/
file.txt
sub2/ (empty)
。目录集合将选择 top/、top/sub1/和 top/sub2/,但不会选择 top/sub1/file.txt。 <delete>
作用于集合,不会删除非空目录。 因此,在上述情况下,它将删除top/sub2(为空),但不会删除top/sub1或top/。 这也应该为您解释<move>
尝试的结果,这可以让您了解 dirset 实际上有用的情况。
集包括文件和目录。