当目录存在且未删除时,使Ant的删除任务失败但在根本不存在时则不会

时间:2010-04-15 14:42:31

标签: ant

我的构建脚本中有以下清理函数,我想知道如何改进它。

<target name="clean" description="Clean output directories.">
    <!-- Must not fail on error because it fails if directories don't exist.
         Is there really no better way to do this? -->
    <delete includeEmptyDirs="true" failonerror="false">
        <fileset dir="${main.build.directory}" />
        <fileset dir="dist" />
        <fileset dir="${documentation.build.directory}" />
        <fileset dir="/build-testing" />
    </delete>
</target>

特别是关于我的评论,我不满意我无法在新盒子上运行它,因为其他目标尚未设置目录结构。我们以这样的方式运行构建,即它每次都完全重新创建测试和部署所需的结构,以避免过时的类文件等。使用当前设置删除的方式,删除文件失败不会使构建失败,我希望它能够。如果文件不存在,我希望它失败。如果它不存在那么我要求它做的事情已经发生了。

思想?

2 个答案:

答案 0 :(得分:9)

via Michael's answer,这是我所需要的90%,但不是那么完整。

由于您的回答,我最终得到的实际解决方案如下:

<target name="clean" description="Clean output directories.">
    <!-- Must not fail on error because it fails if directories don't exist.
         Is there really no better way to do this? -->
    <delete includeEmptyDirs="true" failonerror="false">
        <fileset dir="${main.build.directory}" />
        ...
    </delete>

    <available 
            file="${main.build.directory}"
            type="dir"
            property="delete-main-failure" /> ...

    <condition property="delete-failure">
        <and>
            <isset property="delete-main-failure" /> ...
        </and>
    </condition>
    <fail 
            if="delete-failure"
            message="Unable to delete previous build's directories." />
</target>

这符合我的标准,即代码会尝试删除它,如果它仍然存在则会失败。虽然这很丑陋。删除任务的默认行为让我非常奇怪。我认为理由是,如果你试图删除某些内容并且它不存在,则必然会出现问题,但在我看来,正常的情况是,如果它不存在,那么你就不会这样做。关心,因为它已经消失,而奇怪的情况是你需要它在那里,但现在它不应该在构建的这个特定阶段。

答案 1 :(得分:5)

我来这里问同样的问题......看起来没有一种优雅的方法可以解决这个问题。当我想保持代码清洁时,我这样做:

<mkdir dir="${main.build.directory}" />
<delete dir="${main.build.directory}" failonerror="true" />

我认为删除任务没有“if”属性。将不得不检查出来。