Есть ли способ проверить существование каталога в Ant (а не в файле)?

Как проверить наличие папки с помощью Ant?

Мы можем проверить наличие файла, но можем ли мы сделать то же самое и для папки?

Ответ 1

Вы используете задачу available с типом, установленным в "dir".

Например:

<available file="${dir}" type="dir"/>

Стандартный способ выполнения условной обработки - это условие задачи. В приведенном ниже примере выполнение doFoo будет эхо-сообщение, если каталог существует, тогда как работа doBar будет эхо-сообщение, если только каталог не существует.

Цель dir.check требуется как doFoo, так и doBar, она устанавливает свойство dir.exists в true или false в зависимости от результата доступной задачи. Цель doFoo будет выполняться только в том случае, если для этого свойства установлено значение true, а doBar будет работать только в том случае, если он не установлен или установлен в false.

<?xml version="1.0"?>
<project name="test" default="doFoo" basedir=".">
  <property name="directory" value="c:\test\directory"/>

  <target name="doFoo" depends="dir.check" if="dir.exists">
    <echo>${directory} exists</echo>
  </target>

  <target name="doBar" depends="dir.check" unless="dir.exists">
    <echo>${directory} missing"</echo>
  </target>

  <target name="dir.check">
    <condition property="dir.exists">
      <available file="${directory}" type="dir"/>
    </condition>
  </target>
</project>

Antelope предоставляет дополнительные задачи, включая задачу If, которая может упростить обработку (и для меня более интуитивно понятную), вы можете загрузите задачи Antelope с страницы загрузки.

Ответ 2

Вот небольшой пример, включающий элемент available в тест if.

<!-- Test if a directory called "my_directory" is present -->
<if>
  <available file="my_directory" type="dir" />
  <then>
    <echo message="Directory exists" />
  </then>
  <else>
    <echo message="Directory does not exist" />
  </else>
</if>

Предупреждение: вам понадобится ant -contrib.jar в вашем каталоге ANT_HOME\lib, иначе у вас не будет доступа к элементам if, и ваш script сработает с этим ошибка:

Problem: failed to create task or type if
Cause: The name is undefined.
Action: Check the spelling.
Action: Check that any custom tasks/types have been declared.
Action: Check that any <presetdef>/<macrodef> declarations have taken place. 

Ответ 3

Здесь мое решение, которое не требует установки свойств и использования целей с помощью "if" или "if":

Macro:

<macrodef name="assertDirAvailable">
    <attribute name="dir" />
    <sequential>
        <fail message="The directory '@{dir}' was expected to be available but is not">
            <condition>
                <not>
                    <available file="@{dir}" type="dir" />
                </not>
            </condition>
        </fail>
    </sequential>
</macrodef>

Использование:

<assertDirAvailable dir="${dirToCheck}" />

Ответ 4

Мое решение с использованием версии ANT 1.8, более старые версии могут не работать, если/если не поддерживается синтаксис ${evalTrueOrFalse}.

<?xml version="1.0" encoding="UTF-8"?>
<project name="DoMagic" default="build" basedir=".">

<property environment="env" />
<property name="name" value="Do the ANT Magic" />
<property name="somedir" value="./must_exist_folder"/>
<tstamp><format property="TODAY" pattern="yyyy-MM-dd HH:mm:ss" /></tstamp>

<target name="doMagic" if="${dir.exists}">
  <echo message="Do the magic stuff" />
</target>

<target name="doUsage" unless="${dir.exists}">
  <echo message="Do usage and help" />
</target>

<target name="build">
  <echo message="Do the magic" />

  <condition property="dir.exists" else="false"><available file="${somedir}" type="dir" /></condition>
  <echo message="Folder found: ${dir.exists}" />
  <antcall target="doCustomize"></antcall>
  <antcall target="doUsage"></antcall>
</target>

</project>
  • ANT 1.6 или раннее ANT 1.7 не работает, обновите до версии ANT 1.8.
  • Целевые атрибуты, если и если не оценивается синтаксис ${var} в true/false
  • Значение атрибута else атрибута свойства устанавливается в свойство, если доступное условие было ложным, без него переменная не установлена. Значение NotSet не совпадает с явным ложным значением.
  • вызов любой цели, но если/если атрибут определяет, действительно ли он выполняется

http://ant.apache.org/manual/properties.html#if+unless
[If/Unless] В ANT 1.7.1 и более ранних, эти атрибуты могут быть только именами свойств. Начиная с ANT 1.8.0, вы можете вместо этого использовать расширение свойства. По сравнению с более старым стилем это дает вам дополнительную гибкость.

Ответ 5

Вот еще один подход, позволяющий вызывать только одну задачу без использования ant -contrib.jar.

<target name="my-task" depends="dir-check">
    <antcall target="my-task-install"/>
    <antcall target="my-task-update"/>
</target>
<target name="my-task-install" unless="dir.exists" >
    {some task}
</target>
<target name="my-task-update" if="dir.exists" >
    {another task}
</target>
<target name="dir-check">
    <condition property="dir.exists">
        <available file="my-dir" type="dir" />
    </condition>
</target>

Ответ 6

Вот еще один пример, включающий цикл for. Ошибка, если каталог не существует.

<for list="dir1/, dir2/, dir3/" param="local.dir" >
    <sequential>
        <fail message="Directory @{local.dir} does not exist">
            <condition>
                <not>
                    <available file="@{local.dir}" type="dir" />
                </not>
            </condition>
        </fail>             
    </sequential>
</for>