Задача Ant для запуска цели Ant, только если файл существует?

153

Существует ли задача ANT, которая будет выполнять блок, только если данный файл существует? У меня проблема в том, что у меня есть общий муравей сценарий, который должен выполнять некоторую специальную обработку, но только при наличии определенного файла конфигурации.

Марио Ортегон
источник

Ответы:

200

Доступен и Состояние

<target name="check-abc">
    <available file="abc.txt" property="abc.present"/>
</target>

<target name="do-if-abc" depends="check-abc" if="abc.present">
    ...
</target> 
Инструментарий
источник
8
Доступно не столь очевидное имя для того, что оно делает. Меня еще больше смутил тот факт, что Google показывает людей, пишущих свои собственные теги
Марио Ортегон,
это может работать, но не кажется хорошим решением, если вам нужно применить к большому количеству файлов
cmcginty
4
В случае , если кто - нибудь задавался вопросом , то ifи unlessатрибуты только включить или отключить цель , к которой они присоединены, то есть зависимости , направленная всегда выполняются. В противном случае не будет зависеть от цели, которая устанавливает свойство, которое вы проверяете.
Щуберт
Похоже, <Available>не рекомендуется. Я использовал это: <target name="do-if-abc" if="${file::exists('abc.txt')}"> ... </target> check: nant.sourceforge.net/release/0.85/help/functions/…
Loïc
1
@ Loïc 1: где говорится, что <available>устарела? 2: ${file::existst...} похоже, не работает с Ant (Apache ANT 1.9.7)
user85421
123

Это может иметь немного больше смысла с точки зрения кодирования (доступно с ant-contrib: http://ant-contrib.sourceforge.net/ ):

<target name="someTarget">
    <if>
        <available file="abc.txt"/>
        <then>
            ...
        </then>
        <else>
            ...
        </else>
    </if>
</target>
Адам
источник
36
Я думаю, это доступно только в ant-contrib.
Ричард Кук
26

Начиная с Ant 1.8.0, по-видимому, также существует ресурс

От http://ant.apache.org/manual/Tasks/conditions.html

Тестирует ресурс на существование. начиная с Ant 1.8.0

Фактический ресурс для тестирования указывается как вложенный элемент.

Пример:

<resourceexists>
  <file file="${file}"/>
</resourceexists>

Я собирался переделать пример из приведенного выше хорошего ответа на этот вопрос, а потом нашел это

Начиная с Ant 1.8.0, вы можете вместо этого использовать расширение свойства; значение true (или включено или да) включит элемент, в то время как false (или выключено или нет) отключит его. Другие значения по-прежнему считаются именами свойств, поэтому элемент активируется, только если определено именованное свойство.

По сравнению со старым стилем это дает дополнительную гибкость, поскольку вы можете переопределить условие из командной строки или родительских сценариев:

<target name="-check-use-file" unless="file.exists">
    <available property="file.exists" file="some-file"/>
</target>
<target name="use-file" depends="-check-use-file" if="${file.exists}">
    <!-- do something requiring that file... -->
</target>
<target name="lots-of-stuff" depends="use-file,other-unconditional-stuff"/>

из руководства по муравьям по адресу http://ant.apache.org/manual/properties.html#if+unless

Надеюсь, этот пример пригодится некоторым. Они не используют ресурсные ресурсы, но, вероятно, вы могли бы? .....

Джон Стаффорд
источник
2
Обратите внимание, что if="${file.exists}"следует заменить на if="file.exists"as ifи unlessпроверять только наличие свойства по имени, а не по его значению.
Вадим
1
@Vadzim Как уже упоминалось в ответе, это работает только в Ant 1.8, а 1.8 поддерживает расширение свойств. ant.apache.org/manual/properties.html#if+unless
Даниэль Янковский,
12

Я думаю, что стоит сослаться на этот аналогичный ответ: https://stackoverflow.com/a/5288804/64313

Вот еще одно быстрое решение. Существуют и другие варианты этого <available>тега:

# exit with failure if no files are found
<property name="file" value="${some.path}/some.txt" />
<fail message="FILE NOT FOUND: ${file}">
    <condition><not>
        <available file="${file}" />
    </not></condition>
</fail>
cmcginty
источник
3

Проверьте использование файловых фильтров, например DB_*/**/*.sql

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

Здесь мы ищем файлы " * .sql " в любых подкаталогах с именем " DB_ * ", рекурсивно. Вы можете настроить фильтр в соответствии с вашими потребностями.

NB: Apache Ant 1.7 и выше!

Вот цель для установки свойства, если существуют соответствующие файлы:

<target name="check_for_sql_files">
    <condition property="sql_to_deploy">
        <resourcecount when="greater" count="0">
            <fileset dir="." includes="DB_*/**/*.sql"/>
        </resourcecount>
    </condition>
</target>

Вот «условная» цель, которая запускается, только если файлы существуют:

<target name="do_stuff" depends="check_for_sql_files" if="sql_to_deploy">
    <!-- Do stuff here -->
</target>
Дэвид Робсон
источник
0

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

<delete>
    <fileset includes="name or names of file or files you need to delete"/>
</delete>

Смотрите: FileSet .

Гангнус
источник