Выключить задачу Ant при удалении, если каталог существует и не удален, но не когда он вообще не существует - PullRequest
11 голосов
/ 15 апреля 2010

В моем скрипте сборки есть следующая чистая функция, и я хотел бы знать, как ее улучшить.

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

9 голосов
/ 13 января 2012

через ответ Михаила , что составляло 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>

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

5 голосов
/ 13 мая 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...