Сделать Ant удалить задачу, если каталог существует и не удаляется, но не когда он вообще не существует

У меня есть следующая чистая функция в моей сборке script, и я хотел бы знать, как я могу ее улучшить.

<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>

В частности, в отношении моего комментария, я недоволен тем, что я не могу запустить это в новом окне, потому что структура каталогов еще не была настроена другими целями. Мы запускаем сборку таким образом, чтобы она полностью воссоздавала структуры, необходимые для тестирования и развертывания, каждый раз, чтобы избежать устаревших файлов классов и т.д. С тем, как в настоящее время удаляется удаление, отказ в удалении файла не приведет к сбою сборки, и я бы хотел. Я не хочу, чтобы он выходил из строя, если файл не существует. Если этого не существует, то то, что я прошу сделать, уже произошло.

Мысли?

Ответ 1

через ответ Майкла, который был 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 directories." />
</target>

Это соответствует моим критериям, что код пытается удалить его, а затем сбой, если он все еще существует. Это очень уродливо. Поведение по умолчанию задачи удаления кажется мне очень странным. Я полагаю, что обоснование состоит в том, что если вы пытаетесь что-то удалить, а его нет, то что-то должно быть не так, но мне кажется, что нормальный случай будет заключаться в том, что если он не там, вам все равно, потому что он уже прошел, что вам нужно, чтобы он был там, но теперь он не должен быть на этом конкретном этапе сборки.

Ответ 2

Я пришел сюда, чтобы задать тот же вопрос... не похоже, что есть элегантный способ решить эту проблему. Когда я хочу, чтобы код был чистым, я делаю это следующим образом:

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

Я не думал, что задача delete имеет свойство "if". Придется проверить это.