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