Есть ли задача ANT, которая будет выполнять блок только в том случае, если данный файл существует? У меня проблема в том, что у меня есть общий сценарий ant, который должен выполнять некоторую специальную обработку, но только при наличии определенного файла конфигурации.
Задача Ant для запуска цели Ant, только если файл существует?
Ответы (6)
<target name="check-abc">
<available file="abc.txt" property="abc.present"/>
</target>
<target name="do-if-abc" depends="check-abc" if="abc.present">
...
</target>
if
и unless
только включают или отключают цель, к которой они прикреплены, то есть зависимости цели всегда выполняются. В противном случае нельзя было бы зависеть от цели, которая устанавливает свойство, которое вы проверяете.
- person sschuberth; 07.07.2013
<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
<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>
Начиная с 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, но, предположительно, вы могли бы? .....
if="${file.exists}"
следует заменить на if="file.exists"
, поскольку if
и unless
проверяют только наличие свойства по имени, а не его значение.
- person Vadzim; 07.10.2013
Я думаю, что стоит сослаться на этот аналогичный ответ: 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>
Установите флажок "Использование фильтров имени файла, например 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>
Вы можете сделать это, заказав операцию со списком файлов, имена которых совпадают с нужными вам именами. Это намного проще и проще, чем создать особую мишень. И вам не нужны никакие дополнительные инструменты, только чистый Ant.
<delete>
<fileset includes="name or names of file or files you need to delete"/>
</delete>
См. FileSet.