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


Odpowiedzi:


200

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> 

8
Dostępne to nieoczywista nazwa tego, co robi. Byłem jeszcze bardziej zdezorientowany faktem, że Google pokazuje, że ludzie piszą własne tagi
— Mario Ortegón,

to może zadziałać, ale nie wydaje się dobrym rozwiązaniem, jeśli musisz zastosować się do dużej liczby plików
— cmcginty

4
W przypadku, gdy ktoś się zastanawiał, atrybuty ifi unlesswłączają lub wyłączają tylko cel, do którego są dołączone, tj. Zależności celu są zawsze wykonywane. W przeciwnym razie nie działałoby uzależnienie od celu, który ustawia sprawdzaną właściwość.
— sschuberth,

Wygląda na to, że <Available>jest przestarzały. Użyłem tego: <target name="do-if-abc" if="${file::exists('abc.txt')}"> ... </target> sprawdź: nant.sourceforge.net/release/0.85/help/functions/ ...
— Loïc

1
@ Loïc 1: gdzie stwierdza się, że <available>jest przestarzały? 2: ${file::existst...} wygląda na to, że nie działa z Ant (Apache ANT 1.9.7)
— user85421

123

Może to 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>

36
Myślę, że jest to dostępne tylko w ant-contrib.
— Richard Cook

26

Od wersji Ant 1.8.0 najwyraźniej istnieją również zasoby

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

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

Rzeczywisty zasób do przetestowania jest określony jako element zagnieżdżony.

Przykład:

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

Chciałem przerobić przykład z powyższej dobrej odpowiedzi na to pytanie, a potem to znalazłem

Od Ant 1.8.0 możesz zamiast tego używać rozszerzania właściwości; wartość true (lub on lub yes) włączy element, a false (lub off lub no) wyłączy go. Zakłada się, że inne wartości są nazwami właściwości, dlatego element jest włączony tylko wtedy, gdy określona właściwość jest zdefiniowana.

W porównaniu ze starszym stylem zapewnia to dodatkową elastyczność, ponieważ można zastąpić warunek z wiersza poleceń lub skryptów nadrzędnych:

<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ówek pod adresem http://ant.apache.org/manual/properties.html#if+unless

Miejmy nadzieję, że ten przykład przyda się niektórym. Nie używają zasobów istniejących, ale prawdopodobnie mógłbyś? .....


2
Zauważ, że if="${file.exists}"należy zastąpić if="file.exists"as ifi unlesssprawdzić tylko istnienie właściwości według nazwy, a nie jej wartości.
— Vadzim

1
@Vadzim Jak wspomniano w odpowiedzi, działa to tylko w Ant 1.8, a 1.8 obsługuje ekspansję własności. ant.apache.org/manual/properties.html#if+unless
— Daniel

12

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 <available>tagu:

# 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

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

Oto odmiana wykonywania akcji, jeśli istnieje co najmniej jeden plik odpowiadający filtrowi wieloznacznemu. Oznacza to, że nie znasz dokładnej nazwy pliku.

W tym miejscu szukamy rekursywnie plików " * .sql " w dowolnych podkatalogach o nazwie " DB_ * ". Możesz dostosować filtr do swoich potrzeb.

Uwaga: Apache Ant 1.7 i nowsze!

Oto cel ustawienia właściwości, jeśli istnieją pasujące pliki:

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

Oto „warunkowy” cel, 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>

0

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 bardziej bezpośrednie niż stworzenie specjalnego celu. I nie potrzebujesz żadnych dodatkowych narzędzi, po prostu czysta Ant.

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

Zobacz: FileSet .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.