Karınca görevi sadece bir dosya varsa bir Karınca hedefi çalıştırmak için?


153

Yalnızca belirli bir dosya varsa bir blok yürütecek bir ANT Görevi var mı? Ben sadece belirli bir yapılandırma dosyası varsa, bazı özel işleme yapması gerekir genel bir ant komut dosyası var sorun var.


Ayrıca bkz.
Ant'in

Yanıtlar:


200

Mevcut ve Durum

<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
Kullanılabilir, yaptığı şey için çok açık olmayan bir isimdir.
Google'ın

işe yarayabilir, ancak çok sayıda dosyaya başvurmanız gerekiyorsa iyi bir çözüm gibi görünmüyor
cmcginty

4
Herhangi birinin merak etmesi durumunda, ifve unlessöznitelikleri yalnızca eklendikleri hedefi etkinleştirir veya devre dışı bırakır, yani hedefin bağımlılıkları her zaman yürütülür. Aksi takdirde, kontrol ettiğiniz mülkü ayarlayan bir hedefe bağlı olarak çalışmayacaktır.
sschuberth

Kullanımdan <Available>kaldırılmış gibi görünüyor . Bunu kullandım: <target name="do-if-abc" if="${file::exists('abc.txt')}"> ... </target> kontrol edin: nant.sourceforge.net/release/0.85/help/functions/…
Loïc

1
@ Loïc 1:<available> kullanımdan kaldırıldığı nerede belirtilir ? 2: ${file::existst...} Ant ile çalışmıyor gibi görünüyor (Apache ANT 1.9.7)
user85421

123

Bu, kodlama perspektifinden biraz daha mantıklı olabilir (karınca katkısı ile kullanılabilir: http://ant-contrib.sourceforge.net/ ):

<target name="someTarget">
    <if>
        <available file="abc.txt"/>
        <then>
            ...
        </then>
        <else>
            ...
        </else>
    </if>
</target>

36
Bu sadece karınca katkısında kullanılabilir bence.
Richard Cook

26

Ant 1.8.0'dan beri kaynak var.

Gönderen http://ant.apache.org/manual/Tasks/conditions.html

Bir kaynağı varlığını test eder. Ant 1.8.0'dan beri

Test edilecek gerçek kaynak, iç içe geçmiş bir öğe olarak belirtilir.

Bir örnek:

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

Bu soruya yukarıdaki iyi cevabın örneğini yeniden çalışmak üzereydim ve sonra bunu buldum

Ant 1.8.0'dan itibaren, bunun yerine özellik genişletmeyi kullanabilirsiniz; true (veya on veya yes) değeri öğeyi etkinleştirir, false (veya off veya no) değeri ise devre dışı bırakır. Diğer değerlerin yine de özellik adları olduğu varsayılır ve bu nedenle öğe yalnızca belirtilen özellik tanımlanmışsa etkinleştirilir.

Eski stille karşılaştırıldığında, bu size ek esneklik sağlar, çünkü koşulu komut satırından veya üst komut dosyalarından geçersiz kılabilirsiniz:

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

http://ant.apache.org/manual/properties.html#if+unless adresindeki karınca kılavuzundan

Umarım bu örnek bazılarına faydalıdır. Kaynak varoluşları kullanmıyorlar, ama muhtemelen yapabilirsin?


2
Bunun as if="${file.exists}"ile değiştirilmesi ve mülkün değerinin değil, yalnızca ismine göre kontrol edilmesi gerektiğini unutmayın . if="file.exists"ifunless
Vadzim

1
@Vadzim Belirtildiği gibi, bu sadece Ant 1.8'de çalışır ve 1.8 mülk genişlemesini destekler. ant.apache.org/manual/properties.html#if+unless
Daniel Yankowsky

12

Bence bu benzer cevaba değinmeye değer: https://stackoverflow.com/a/5288804/64313

İşte başka bir hızlı çözüm. Bu <available>etiketi kullanarak başka varyasyonlar da olabilir :

# 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

Aşağıdaki gibi Dosya Adı filtrelerini kullanmayı kontrol edin DB_*/**/*.sql

Joker karakter filtresine karşılık gelen bir veya daha fazla dosya varsa bir eylemi gerçekleştirmek için bir varyasyon. Yani, dosyanın tam adını bilmiyorsunuz.

Burada, " DB_ * " adı verilen herhangi bir alt dizinde " * .sql " dosyaları arıyoruz . Filtreyi ihtiyaçlarınıza göre ayarlayabilirsiniz.

Not: Apache Ant 1.7 ve üstü!

Eşleşen dosyalar varsa bir özellik ayarlama hedefi şunlardır:

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

Yalnızca dosyalar varsa çalışan "koşullu" bir hedef:

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

0

İşlemi, ihtiyacınız olan adlara eşit olan dosyaların bir listesiyle yapmak için sipariş vererek yapabilirsiniz. Özel bir hedef oluşturmaktan çok daha kolay ve doğrudan. Ek bir araca ihtiyacınız yok, sadece saf Ant.

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

Bkz . FileSet .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.