2012-05-07 8 views
5

ビルドスクリプトには、いくつかのデフォルトパラメータ、ターゲット、ルートなどを必要とするmacrodefを持つAntが組み込まれています。 、extrasrc-fおよびextrasrc-c。彼らが来た後、私は関連するすべてのリソースについて最新のチェックを行い、ターゲットが古くなった場合にのみビルドを行います。私は現時点で持っている何実行時に動的コンテンツを持つUnionおよびMacrodefスタイルの要素をAntで作成する

<?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> 

しかし、あなたは、それは非効率的だ私にとって、この時点で、見ることができる私がやりたいように、私が作成し、でで渡すようにしました少なくとも1つのファイルセット、および複数のクラスパス。私が本当にしたいのは、ディレクトリのリストを渡してから、その情報からextrasrc-fとextrasrc-c要素を作成するだけですが、私の人生にとっては、それを行うことができます。

私はAntとAnt-Contribのファンキーなクラスをたくさん読んだことがありますが、私にはこのようなことをするための何かを読んだことはありません。明らかな状況。

私は非常に間違った方法でこれに近づいていますか、それとも何か不足していますか?もし私が本当にAntを悪用しようとしているなら、私は適切な方法で正しい方法でポインタを得て、catchallを作成し、複数のソースをテストするmacrodef(またはそれを行う唯一の方法)ファイルをビルドされた1つのファイルに対して追加することができます。また、余分なクラスまたはライブラリパスも1つのリストに入れることができます。

答えて

0

多分<scriptdef>タスクを使用して、これらのマクロを分割することができます。

まず、カンマで区切られたディレクトリのリストを取得し、それらから<union>を生成するディレクトリ。あなたはid属性としてユニオンを参照するために使用するrefidを指定します。オプションのインクルードと除外があります。

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

二 - - 非常によく似たスクリプトは、パス生成のための同等ん:あなたは、あなたのマクロを変更でき

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

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

を使用例は、のようなものかもしれませんdirs属性を使用して内部的に共用体とクラスパスを生成するか、またはこれらを一度生成して参照を渡すだけです。

私はこの図に@{root}ディレクトリを含めることを試みたわけではありませんが、これを上記のように変更することは可能です。

+0

遅い応答に対する謝罪。 –

+0

母親、マーティンを心配するつもりはないが、遅れても応答は常に高く評価される。私はこの質問をして以来、私はもはや同じ会社にいませんが、私はAntスクリプトを定期的に使っていますが、scriptdefのことは知らなかったので、そんなに感謝します! – seaders

関連する問題