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.
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.
Jawaban:
<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
dan unless
hanya 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.
<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/…
<available>
sudah usang? 2: ${file::existst...}
tampaknya tidak bekerja dengan Ant (Apache ANT 1.9.7)
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>
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? .....
if="${file.exists}"
harus diganti dengan if="file.exists"
as if
dan unless
periksa hanya keberadaan properti dengan nama, bukan nilainya.
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>
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>
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 .