Задача Ant для запуска цели Ant, только если файл существует? - PullRequest
149 голосов
/ 06 февраля 2009

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

Ответы [ 6 ]

197 голосов
/ 06 февраля 2009

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

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

<target name="do-if-abc" depends="check-abc" if="abc.present">
    ...
</target> 
120 голосов
/ 21 июля 2010

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

<target name="someTarget">
    <if>
        <available file="abc.txt"/>
        <then>
            ...
        </then>
        <else>
            ...
        </else>
    </if>
</target>
25 голосов
/ 28 июля 2010

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

С http://ant.apache.org/manual/Tasks/conditions.html

Проверяет ресурс на существование. поскольку Муравей 1.8.0

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

Пример:

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

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

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

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

<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

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

12 голосов
/ 15 мая 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>
2 голосов
/ 28 января 2016

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

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

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

Примечание: 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 голосов
/ 16 мая 2014

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

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

См .: FileSet .

...