2010-01-26 28 views
5

Karınca 1.6.2 kullanıyorum ve bir kaynak ve hedef dizini karşılaştıracak, kaynak dizinde var olan tüm alt dizinleri tanımlayacak ve hedef dizinde beğendi olan alt dizinleri silecek bir görev kurmaya çalışıyorum.Bir FileSet kullanarak karıncadaki alt dizinleri nasıl seçerim?

Yani, kaynak dizinin alt dizinleri sub1, sub2 ve sub3'ün içerdiğini ve hedef dizinin içinde sub1, sub2, sub3 ve sub4 olduğunu varsayalım, sonra sub1, sub2 ve sub3'ü silmek istiyorum hedef dir

Bunu, hedefte bulunan kaynaktaki tüm dizinleri tanımlamak için bir FileSelector kullanarak yapabileceğimi düşündüm. Ancak, dizinler için bir eşleşme yapabilmek için < tip> dosya seçicisini alamıyorum. ,

<fileset id="dirSelector" dir="${install.dir}"> 
    <type type="dir"/> 
</fileset> 
<property name="selected" refid="dirSelector" /> 
<echo>Selected: ${selected}</echo> 

Ancak:

<fileset id="dirSelector" dir="${install.dir}"> 
    <type type="dir"/> 
    <present targetdir="${dist.dir}"/> 
</fileset> 

Sadece kaynak dizininde mevcut dizinleri listelemek ve bunları yazdırmak için çalışarak başladı:

Sonuçta, ben böyle bir şey yapmayacağını düşündük Asla, tip seçiciyle dizine ayarlanmış hiçbir şey yazdırılmam. Türünü dosya olarak değiştirirsem, dosyaları yazdırmak istiyorum.

Yapmaya çalıştığım şeyi başarmanın daha iyi bir yolu var mı? Tip seçiciyi kullanmamda bir şey mi eksik?

cevap

4

Özel bir Ant görevi yazmadan, bu biraz dağınık olur. ant-contrib kütüphanesini kullanmaktan memnunsanız, aşağıdakiler hile yapmalıdır. Bu bir kesmek (özellikle özellikleri kullanır) biraz ama işe yarıyor gibi görünüyor.

<project name="stackoverflow" default="delete_target_dirs"> 

    <taskdef resource="net/sf/antcontrib/antlib.xml"> 
    <classpath> 
     <pathelement location="ant-contrib-1.0b3.jar"/> 
    </classpath> 
    </taskdef> 

    <property name="src.dir" value="src"/> 
    <property name="target.dir" value="target"/> 

    <target name="delete_target_dirs"> 

    <for param="file"> 
     <path> 
     <dirset dir="${src.dir}"> 
      <include name="**"/> 
     </dirset> 
     </path> 

     <sequential> 
     <basename property="@{file}_basename" file="@{file}" /> 
     <available property="@{file}_available" file="${@{file}_basename}" filepath="${target.dir}" /> 
     <if> 
      <equals arg1="${@{file}_available}" arg2="true"/> 
      <then> 
      <delete verbose="true"> 
       <dirset dir="${target.dir}" includes="${@{file}_basename}"/> 
      </delete> 
      </then> 
     </if>     
     </sequential> 
    </for> 

    </target> 

</project> 
+1

Yardımın için teşekkürler. Şu anda ant katkıda bulunan kütüphaneyi kullanmıyorum, bu yüzden ilk önerdiğiniz özel görev rotasını denemeyi düşündüm. Bu oldukça kolay ve harika çalıştı. Teşekkürler. –

+0

@EricRosenberg Lütfen özel görevi cevabınız olarak gönderir misiniz? Bu SO ile iyi çalışıyor ve aradığımız bir şey olurdu. –

+0

@OzairKafray Üzgünüz, ancak artık özel görev uygulamasına erişimim yok. –

İlgili konular