2012-05-07 16 views
5
Ant

yılında zamanında dinamik içeriğe sahip bir Birlik ve Macrodef tarzı elemanı oluşturma , extrasrc-f ve extrasrc-c. Geldikten sonra, ilgili tüm kaynaklar için güncel bir kontrol yapmak istiyorum, o zaman sadece hedef güncel değilse bir inşa yapın. Şu anda ne varSonra isteğe bağlı iki birkaç varsayılan parametreleri, hedef, kök ve benzeri ve götüren bir macrodef sahiptir Ant inşa edilmiş bir yapı komut dosyası ettik

,

<?xml version="1.0" encoding="UTF-8"?> 
<project name="Custom build" default="default"> 

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

    <macrodef name="checkuptodate"> 
     <attribute name="target" /> 
     <element name="resource" /> 
     <sequential> 
      <condition property="needbuild"> 
       <and> 
        <resourcecount when="greater" count="0"> <resource /> </resourcecount> 
        <not> 
         <uptodate targetfile="@{target}"> 
          <srcresources> <resource /> </srcresources> 
         </uptodate> 
        </not> 
       </and> 
      </condition> 
     </sequential> 
    </macrodef> 

    <macrodef name="projbuild"> 
     <attribute name="root" /> 
     <attribute name="target" /> 

     <element name="extrasrc-f" optional="true" /> 
     <element name="extrasrc-c" optional="true" /> 
     <sequential> 
      <local name="needbuild" /> 
      <checkuptodate target="@{root}/bin/@{target}"> 
       <resource> 
        <union> 
         <extrasrc-f /> 
         <fileset dir="@{root}/src" includes="**/*.java" /> 
        </union> 
       </resource> 
      </checkuptodate> 

      <if> 
       <istrue value="${needbuild}" /> 
       <then> 
        <javac 
         srcdir="@{root}/src" 
         destdir="@{root}/bin" 
         includeantruntime="false" 
        > 
         <extrasrc-c /> 
        </javac> 
       </then> 
      </if> 

     </sequential> 
    </macrodef> 

    <target name="default"> 

     <projbuild root="." target="EntryPoint.class"> 
      <extrasrc-f> 
       <fileset dir="Proj2/src" includes="**/*.java" /> 
       <fileset dir="Proj3/src" includes="**/*.java" /> 
      </extrasrc-f> 
      <extrasrc-c> 
       <classpath location="Proj2/src" /> 
       <classpath location="Proj3/src" /> 
      </extrasrc-c> 
     </projbuild> 

    </target> 

</project> 

Ama bu verimsiz benim için zaman içinde bu noktada görebilirsiniz İstediğimi yapmak, ben oluşturmak ve en geçmek ettik En az bir dosya grubu ve birden çok sınıf yolu. Yapmak istediğim şey sadece bir dizin listesine girmektir, sonra extrasrc-f ve extrasrc-c elemanlarını bu bilgiden anında yaratabilirsiniz, ama benim için, nasıl olduğumu hiç bilmiyorum. Bunu yapabilirim.

Birçok Ant ve Ant-Contrib korkulu dersi okudum, ama böyle bir şey yapmama izin verecek bir şey okumamıştım, tuhaf buluyorum, çünkü bana göre bariz durum.

Ben çok yanlış bir şekilde bu yaklaşan muyum, yoksa ben eksik bir şey mi? Eğer Ant'i gerçekten yanlış kullanırsam, işaretçiyi doğru şekilde bu şekilde nasıl yaparım, bir catchall, bir makrodefde şablon oluşturmak (veya bunu yapmak için tek yol buysa), birden fazla kaynak test eden Ekstra sınıf veya kütüphane yollarından da geçerken, tercihen tek bir listede bulunan bir dosyaya karşı dosyalar oluşturulur.

cevap

0

Belki bu makro parçalanmasına yardımcı olmak için <scriptdef> görevlerin bir çift kullanabilirsiniz.

Birincisi, dizinlerin virgülle ayrılmış listesini alır ve onlardan <union> üretir biri. id özniteliği olarak birleşim için kullanmak istediğiniz refid tedarik edin. İsteğe bağlı içerir ve hariç tutar.

<scriptdef name="dirs2path" language="javascript"> 
    <attribute name="dirs" /> 
    <attribute name="id" /> 
    <![CDATA[ 
     var dirs = attributes.get("dirs").split(","); 

     var path = project.createDataType("path"); 
     project.addReference(attributes.get("id"), path); 

     for (var i = 0; i < dirs.length; i++) { 
      var pe = project.createDataType("path"); 
      pe.setLocation(new java.io.File(dirs[i])); 
      path.add(pe); 
     } 
    ]]> 
</scriptdef> 

bir örnek kullanımı sonra olabilir gibi bir şey:

<scriptdef name="dirs2union" language="javascript"> 
    <attribute name="dirs" /> 
    <attribute name="id" /> 
    <attribute name="includes" /> 
    <attribute name="excludes" /> 
    <![CDATA[ 
     var dirs = attributes.get("dirs").split(","); 
     var includes = attributes.get("includes"); 
     var excludes = attributes.get("excludes"); 

     var union = project.createDataType("union"); 
     project.addReference(attributes.get("id"), union); 

     for (var i = 0; i < dirs.length; i++) { 
      var fs = project.createDataType("fileset"); 
      fs.setDir(new java.io.File(dirs[i])); 
      if (includes) 
       fs.setIncludes(includes); 
      if (excludes) 
       fs.setExcludes(excludes); 

      union.add(fs); 
     } 
    ]]> 
</scriptdef> 

ikinci - - çok benzer script yolu nesil için eşdeğer yapar

<property name="dirs" value="Proj2/src,Proj3/src" /> 

<dirs2union dirs="${dirs}" id="my.union" includes="**/*.java" /> 
<dirs2path dirs="${dirs}" id="my.path" /> 

... later (e.g.) ... 

<union refid="my.union" /> 
<classpath refid="my.path" /> 

Ardından makro değiştirebilir dirs özniteliğini alıp dahili olarak sendikayı ve sınıf yolunu oluşturmak veya belki de bunları başka bir yerde oluşturup yalnızca başvurularda iletmek için.

Bu resimde @{root} dizinleri dahil etmek teşebbüs değil, ama bunun için yukarıda uyarlamak mümkün olmalıdır. , Ah, yavaş yanıt

+0

Özür. –

+0

Haha, endişelenmenize gerek yok Martin, geç cevap verse bile bir cevap her zaman takdir edilir. Bu soruyu sorduğumdan beri, artık aynı şirkette değilim, ama ben hala düzenli olarak Sc betikleriyle oynuyorum ve scriptdef hakkında hiçbir fikrim yoktu, bunun için çok teşekkürler! – seaders

İlgili konular