问题 当目录存在且未删除时,使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>

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

思考?


1887
2018-04-15 14:42


起源

你能自己回答而不是编辑问题吗?你可以接受你自己的答案然后我可以删除我的答案,因为它最终错了 - Michael Mrozek
先生,你去吧:) - Tim Visher


答案:


通过迈克尔的回答,这是我所需要的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>

这符合我的标准,即代码尝试删除它,然后如果它仍然存在则失败。虽然它太丑了。删除任务的默认行为让我非常奇怪。我认为理由是,如果你试图删除某些东西并且它不存在那么一定是错的,但在我看来,正常的情况是,如果它不在那里你不关心因为它已经消失了奇怪的是,你需要它在那里,但现在它不应该在构建的这个特定阶段。


9
2018-01-13 13:40



“删除任务的默认行为让我感到非常奇怪”这让我觉得错误。 - leonbloy
这里的条件任务似乎多余。 - mcsilvio


我来到这里问同样的问题......看起来并不是有一种优雅的方式来解决这个问题。当我想保持代码清洁时,我这样做:

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

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


5
2018-05-13 04:45