2009-07-22 30 views
30

Bir klasörü başka bir yere kopyalayacak bir Ant komut dosyasına ihtiyacım var. İyi bir itaatkâr programcı olarak, kendimi tekrarlamamak istiyorum. Böyle bir fileset alarak herhangi bir yolu var mı:Ant: aynı dosyayı birden çok yere kopyalayın

<copy todir="${target}/path/to/target/1"> 
    <fileset dir="${src}"> 
     <exclude name='**/*svn' /> 
    </fileset> 
</copy> 

Ve yeniden kullanılabilmesi için bir değişkende fileset depolamak?

cevap

38

Dosya kümesinde bir kimlik özniteliği belirtin ve ardından her kopyalama görevine başvurun. Örneğin

:

<project name="foo"> 
    <fileset id="myFileSet" dir="${src}"> 
    <exclude name='**/*svn' /> 
    </fileset> 
    ... 
    <target name="copy1"> 
    <copy todir="${target}/path/to/target/1"> 
     <fileset refid="myFileSet"/> 
    </copy> 
    </target> 
    <target name="copy2"> 
    <copy todir="${target}/path/to/target/2"> 
     <fileset refid="myFileSet"/> 
    </copy> 
    </target> 
</project> 
+0

Doğru. Bu burada tanımlanmıştır: https://ant.apache.org/manual/Types/filterset.html "FilterSet tanımlayın ve daha sonra başvurun." –

+0

Bazı dosya seçici seçicilerinin, aynı dosya grubuna iki kez başvurmak anlamına gelen yan etkilere sahip olabileceğini unutmayın. Örneğin: '', ilk çalıştırmadan sonra önbelleğini günceller ve alttaki dosyalarda hiçbir değişiklik olmadığı varsayılarak boş bir kümeye dönersek, dosya kümesine daha sonra yeniden başvurulur. –

28

Rich's answer Özgül sorun muhtemelen daha iyi olduğunu, ancak Ant kodu yeniden jenerik yolu <macrodef> olduğunu.

<macrodef name="copythings"> 
    <attribute name="todir"/> 
    <sequential> 
    <copy todir="@{todir}"> 
     <fileset dir="${src}"> 
     <exclude name='**/*svn' /> 
     </fileset> 
    </copy> 
    </sequential> 
</macrodef> 

<copythings todir="/path/to/target1"/> 
<copythings todir="/path/to/target2"/> 
+0

Bu kabul edilen cevap olmalı. Asıl kabul edilen cevap tekrarlanan koddur, bu da OP'nin kaçınmaya çalıştığı şeyin tam olarak ne olduğudır. – searchengine27

0

Zaten ilk yanıttan daha önce ayrılmış, ancak birden fazla hedefe kopyalamak için bir eşleştirici de kullanabilirsiniz.

İlgili konular