Zadanie Ant aby uruchomić cel Ant tylko wtedy, gdy istnieje plik?

Czy istnieje zadanie ANT, które wykonałoby blok tylko wtedy, gdy dany plik istnieje? Mam problem, że mam ogólny skrypt ant, który powinien wykonać jakieś specjalne przetwarzanie, ale tylko wtedy, gdy istnieje konkretny plik konfiguracyjny.

Author: jevon, 2009-02-06

6 answers

Dostępne i Stan

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

<target name="do-if-abc" depends="check-abc" if="abc.present">
    ...
</target> 
 194
Author: toolkit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-15 23:49:10

To może mieć trochę więcej sensu z punktu widzenia kodowania (dostępne z ant-contrib: http://ant-contrib.sourceforge.net/):

<target name="someTarget">
    <if>
        <available file="abc.txt"/>
        <then>
            ...
        </then>
        <else>
            ...
        </else>
    </if>
</target>
 115
Author: Adam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-24 16:15:21

Od Ant 1.8.0 podobno jest też resourceexists

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

Testuje zasób pod kątem istnienia. od Ant 1.8.0

[[2]}faktycznym zasobem do przetestowania jest określony jako element zagnieżdżony.

Przykład:

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

Chodziło mi o przerobienie przykładu z powyższej dobrej odpowiedzi na to pytanie, a potem znalazłem to

Od wersji Ant 1.8.0, możesz zamiast tego użyć ekspansja nieruchomości; wartość true (lub na lub tak) włączy element, while false (or off or no) will wyłącz to. Inne wartości są nadal przyjmuje się, że są to nazwy nieruchomości i tak element jest włączony tylko wtedy, gdy o nazwie właściwość jest zdefiniowana.

W porównaniu do starszego stylu, to zapewnia dodatkową elastyczność, ponieważ możesz przesłaniać warunek z wiersza poleceń lub rodzica Skrypty:

<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"/>

Z podręcznika mrówki w http://ant.apache.org/manual/properties.html#if + chyba że

Miejmy nadzieję, że ten przykład jest przydatny dla niektórych. Nie używają resourceexists, ale prawdopodobnie można?.....

 25
Author: Jon Stafford,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-28 13:52:32

Myślę, że warto odnieść się do tej podobnej odpowiedzi: https://stackoverflow.com/a/5288804/64313

Oto kolejne szybkie rozwiązanie. Istnieją inne możliwe odmiany tego tagu <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>
 11
Author: cmcginty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:31

Sprawdź używając filtrów nazw plików, takich jak DB_*/**/*.sql

Tutaj jest odmiana do wykonywania akcji, jeśli istnieje jeden lub więcej plików odpowiadających filtrowi wieloznacznemu. Oznacza to, że nie znasz dokładnej nazwy pliku.

Tutaj szukamy "*.sql "pliki w dowolnych podkatalogach o nazwie" DB_ * ", rekurencyjnie. Możesz dostosować filtr do swoich potrzeb.

Uwaga: Apache Ant 1.7 i wyżej!

Tutaj jest cel, aby ustawić właściwość, jeśli pasujące pliki exist:

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

Tutaj jest cel "warunkowy", który działa tylko wtedy, gdy istnieją pliki:

<target name="do_stuff" depends="check_for_sql_files" if="sql_to_deploy">
    <!-- Do stuff here -->
</target>
 2
Author: David Robson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-20 12:37:13

Możesz to zrobić, zlecając wykonanie operacji z listą plików o nazwach równych nazwom, których potrzebujesz. Jest to o wiele łatwiejsze i bezpośrednie niż stworzenie specjalnego celu. I nie potrzebujesz żadnych dodatkowych narzędzi, tylko czysta Mrówka.

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

Patrz: Zbiór Plików .

 0
Author: Gangnus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-20 12:36:35