Завдання мураха запустити ціль мурашника лише за наявності файлу?


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 показує, що люди пишуть власні теги
Mario Ortegón

це може спрацювати, але це не здається гарним рішенням, якщо вам потрібно застосувати велику кількість файлів
cmcginty

4
У випадку, коли хтось замислився, атрибути ifта unlessатрибути лише включають або відключають ціль, до якої вони приєднані, тобто залежності цілі завжди виконуються. Інакше це не спрацює залежно від цілі, яка встановлює властивість, яку ви перевіряєте.
sschuberth

Це схоже на <Available>застаріле. Я використав це: <target name="do-if-abc" if="${file::exists('abc.txt')}"> ... </target> перевірити: nant.sourceforge.net/release/0.85/help/functions/…
Loïc

1
@ Loïc 1: де зазначено, що <available>застаріло? 2: ${file::existst...} начебто, не працює з Ant (Apache ANT 1.9.7)
користувач85421

123

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

<target name="someTarget">
    <if>
        <available file="abc.txt"/>
        <then>
            ...
        </then>
        <else>
            ...
        </else>
    </if>
</target>

36
Це доступно лише в мурашниках, які я думаю.
Річард Кук

26

Оскільки Ant 1.8.0, мабуть, також існує ресурс

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

Тестує ресурс на існування. з Мурахи 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"як 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>

3

Поставте прапорець Використовуючи такі фільтри, як Filename 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 .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.