Tugas semut untuk menjalankan target Semut hanya jika ada file?

153

Apakah ada Tugas ANT yang akan menjalankan blok hanya jika file yang diberikan ada? Saya memiliki masalah bahwa saya memiliki skrip semut generik yang harus melakukan beberapa pemrosesan khusus tetapi hanya jika ada file konfigurasi tertentu.

Mario Ortegón
sumber

Jawaban:

200

Tersedia dan kondisi

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

<target name="do-if-abc" depends="check-abc" if="abc.present">
    ...
</target> 
toolkit
sumber
8
Tersedia adalah nama yang tidak begitu jelas untuk apa fungsinya. Saya semakin bingung dengan fakta bahwa google menunjukkan orang-orang menulis tag mereka sendiri
Mario Ortegón
mungkin berhasil, tetapi sepertinya bukan solusi yang baik jika Anda perlu mendaftar ke banyak file
cmcginty
4
Jika ada yang bertanya-tanya, atribut ifdan unlesshanya mengaktifkan atau menonaktifkan target yang dilampirkan, yaitu ketergantungan target selalu dieksekusi. Kalau tidak, itu tidak akan berhasil tergantung pada target yang menetapkan properti yang Anda periksa.
sschuberth
Sepertinya <Available>sudah usang. Saya telah menggunakan ini: <target name="do-if-abc" if="${file::exists('abc.txt')}"> ... </target> cek: nant.sourceforge.net/release/0.85/help/functions/…
Loïc
1
@ Loïc 1: di mana ia menyatakan yang <available>sudah usang? 2: ${file::existst...} tampaknya tidak bekerja dengan Ant (Apache ANT 1.9.7)
user85421
123

Ini mungkin lebih masuk akal dari perspektif pengkodean (tersedia dengan semut-contrib: http://ant-contrib.sourceforge.net/ ):

<target name="someTarget">
    <if>
        <available file="abc.txt"/>
        <then>
            ...
        </then>
        <else>
            ...
        </else>
    </if>
</target>
Adam
sumber
36
Ini hanya tersedia di semut-kontrib saya pikir.
Richard Cook
26

Sejak Ant 1.8.0 rupanya ada juga resourceexists

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

Menguji sumber daya untuk keberadaan. sejak Ant 1.8.0

Sumber daya sebenarnya untuk menguji ditentukan sebagai elemen bersarang.

Sebuah contoh:

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

Saya akan mengerjakan ulang contoh dari jawaban bagus di atas untuk pertanyaan ini, dan kemudian saya menemukan ini

Pada Ant 1.8.0, Anda bisa menggunakan ekspansi properti; nilai true (atau on atau yes) akan mengaktifkan item, sementara false (atau off atau tidak) akan menonaktifkannya. Nilai-nilai lain masih dianggap sebagai nama properti dan oleh karena itu item tersebut diaktifkan hanya jika properti yang disebutkan itu didefinisikan.

Dibandingkan dengan gaya yang lebih lama, ini memberi Anda fleksibilitas tambahan, karena Anda dapat mengganti kondisi dari baris perintah atau skrip induk:

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

dari manual semut di http://ant.apache.org/manual/properties.html#if+unless

Semoga contoh ini bermanfaat bagi sebagian orang. Mereka tidak menggunakan sumber daya yang ada, tetapi mungkin Anda bisa? .....

Jon Stafford
sumber
2
Catatan yang if="${file.exists}"harus diganti dengan if="file.exists"as ifdan unlessperiksa hanya keberadaan properti dengan nama, bukan nilainya.
Vadzim
1
@Adzim Seperti jawaban yang disebutkan, ini hanya berfungsi di Ant 1.8, dan 1.8 mendukung ekspansi properti. ant.apache.org/manual/properties.html#if+unless
Daniel Yankowsky
12

Saya pikir nilainya merujuk referensi yang serupa ini: https://stackoverflow.com/a/5288804/64313

Ini adalah solusi cepat lainnya. Ada variasi lain yang memungkinkan untuk ini menggunakan <available>tag:

# 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
sumber
3

Periksa Menggunakan filter Filename like DB_*/**/*.sql

Berikut adalah variasi untuk melakukan tindakan jika ada satu atau lebih file yang sesuai dengan filter wildcard. Artinya, Anda tidak tahu nama pasti file tersebut.

Di sini, kami mencari file " * .sql " di setiap sub-direktori yang disebut " DB_ * ", secara rekursif. Anda dapat menyesuaikan filter dengan kebutuhan Anda.

NB: Apache Ant 1.7 dan lebih tinggi!

Berikut adalah target untuk menetapkan properti jika ada file yang cocok:

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

Berikut adalah target "kondisional" yang hanya berjalan jika ada file:

<target name="do_stuff" depends="check_for_sql_files" if="sql_to_deploy">
    <!-- Do stuff here -->
</target>
David Robson
sumber
0

Anda dapat melakukannya dengan memesan untuk melakukan operasi dengan daftar file dengan nama yang sama dengan nama yang Anda butuhkan. Jauh lebih mudah dan langsung daripada membuat target khusus. Dan Anda tidak perlu alat tambahan, hanya Semut murni.

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

Lihat: FileSet .

Gangnus
sumber