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

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


person Mario Ortegón    schedule 06.02.2009    source источник


Ответы (6)


Доступно и Condition

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

<target name="do-if-abc" depends="check-abc" if="abc.present">
    ...
</target> 
person toolkit    schedule 06.02.2009
comment
Доступность - не столь очевидное название для того, что она делает. Еще больше меня смутил тот факт, что Google показывает, что люди пишут свои собственные теги - person Mario Ortegón; 06.02.2009
comment
это может сработать, но не кажется хорошим решением, если вам нужно применить к большому количеству файлов. - person cmcginty; 15.05.2013
comment
Если кому-то интересно, атрибуты if и unless только включают или отключают цель, к которой они прикреплены, то есть зависимости цели всегда выполняются. В противном случае нельзя было бы зависеть от цели, которая устанавливает свойство, которое вы проверяете. - person sschuberth; 07.07.2013
comment
Похоже, <Available> устарел. Я использовал это: <target name="do-if-abc" if="${file::exists('abc.txt')}"> ... </target> check: nant.sourceforge.net /release/0.85/help/functions/ - person Loïc; 28.03.2017
comment
@ Loïc 1: где говорится, что <available> устарел? 2: ${file::existst...} не работает с Ant (Apache ANT 1.9.7) - person user85421; 07.04.2017

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

<target name="someTarget">
    <if>
        <available file="abc.txt"/>
        <then>
            ...
        </then>
        <else>
            ...
        </else>
    </if>
</target>
person Adam    schedule 20.07.2010
comment
Я думаю, это доступно только в ant-contrib. - person Richard Cook; 23.10.2010

Начиная с 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 (или on, или да) включит элемент, а false (или off, или no) отключит его. Другие значения по-прежнему считаются именами свойств, поэтому элемент активируется только в том случае, если указанное свойство определено.

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

<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

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

person Jon Stafford    schedule 28.07.2010
comment
Обратите внимание, что if="${file.exists}" следует заменить на if="file.exists", поскольку if и unless проверяют только наличие свойства по имени, а не его значение. - person Vadzim; 07.10.2013
comment
@Vadzim Как уже упоминалось, это работает только в Ant 1.8, а 1.8 поддерживает расширение свойств. ant.apache.org/manual/properties.html#if+unless - person Daniel Yankowsky; 12.08.2014

Я думаю, что стоит сослаться на этот аналогичный ответ: 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>
person cmcginty    schedule 15.05.2013

Установите флажок "Использование фильтров имени файла, например 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>
person David Robson    schedule 27.01.2016

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

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

См. FileSet.

person Gangnus    schedule 16.05.2014