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> 
zestaw narzędzi
źródło
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>
Adam
źródło
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ś? .....

Jon Stafford
źródło
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>
cmcginty
źródło
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>
David Robson
źródło
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 .

Gangnus
źródło