Tugas semut untuk menjalankan target Semut hanya jika ada file?


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> 

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>

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? .....


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>

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>

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 .

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.