Czy istnieje zadanie ANT, które wykonałoby blok tylko wtedy, gdy istnieje dany plik? Mam problem z tym, że mam ogólny skrypt Ant, który powinien wykonać specjalne przetwarzanie, ale tylko wtedy, gdy obecny jest określony plik konfiguracyjny.
Czy istnieje zadanie ANT, które wykonałoby blok tylko wtedy, gdy istnieje dany plik? Mam problem z tym, że mam ogólny skrypt Ant, który powinien wykonać specjalne przetwarzanie, ale tylko wtedy, gdy obecny jest określony plik konfiguracyjny.
Odpowiedzi:
<target name="check-abc">
<available file="abc.txt" property="abc.present"/>
</target>
<target name="do-if-abc" depends="check-abc" if="abc.present">
...
</target>
if
i unless
włą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ść.
<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/ ...
<available>
jest przestarzały? 2: ${file::existst...}
wygląda na to, że nie działa z Ant (Apache ANT 1.9.7)
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>
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ś? .....
if="${file.exists}"
należy zastąpić if="file.exists"
as if
i unless
sprawdzić tylko istnienie właściwości według nazwy, a nie jej wartości.
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>
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>
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 .