代码之家  ›  专栏  ›  技术社区  ›  Tim Visher

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

ant
  •  11
  • Tim Visher  · 技术社区  · 16 年前

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

    <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 回复  |  直到 16 年前
        1
  •  9
  •   Community Mohan Dere    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>
    

    这符合我的条件,即代码试图删除它,如果它仍然存在,则会失败。不过,它非常难看。删除任务的默认行为让我觉得很奇怪。我想基本原理是,如果你试图删除一些东西,但它不存在,那么一定有什么问题,但在我看来,正常情况是,如果它不存在,你就不在乎,因为它已经不存在了,而奇怪的情况是,你需要它存在,但现在它不应该在构建的这个特定阶段。

        2
  •  5
  •   Falconne    16 年前

    我来这里也是为了问同样的问题…似乎没有一种优雅的方法来解决这个问题。当我想保持代码整洁时,我会这样做:

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

    我认为删除任务没有“if”属性。我得去看看。

    推荐文章