2012-05-07 4 views
5

몇 가지 기본 매개 변수, 대상, 루트 등을 사용하는 매크로 정의가있는 빌드 스크립트가 Ant로 작성된 다음 선택적 2 개 , extrasrc-f 및 extrasrc-c. 그들이 들어온 후에, 나는 관련된 모든 자원에 대한 최신 체크를하고 싶다. 그리고 목표가 시대에 뒤진 경우에만 빌드를한다. 내가 지금 무엇을 가지고Ant에서 런타임에 동적 컨텐트가있는 Union 및 Macrodef 스타일 요소 만들기

,

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

하지만, 그것은 비효율적 나를 위해,이 시점에서 볼 수 있습니다 내가하고 싶은 일을하기 위해, 내가 만들어에서의 통과했습니다 최소한 하나의 파일 세트 및 다중 클래스 경로. 제가 정말로하고 싶은 것은 단지 디렉토리 목록을 전달한 다음 그 정보로부터 즉석에서 extrasrc-f와 extrasrc-c 요소를 생성하는 것입니다. 그러나 저의 삶에 대해, 그럴 수 있어요.

필자는 개미와 개미 펑키 클래스를 많이 읽었지만 나에게 이상하게 보이는 것을 할 수있는 내용은 읽지 않았다. 명백한 상황.

나는 이것을 매우 잘못된 방식으로 접근하고 있습니까, 아니면 제가 빠진 것이 있습니까? 내가 정말로 앤트를 오용하고 있다면, 올바른 방향으로 포인터를 쓰는 것이 좋을 것입니다. catchall을 생성하고, 여러 소스를 테스트하는 macrodef (또는 목표, 그것이 유일한 방법입니다)에서 템플릿을 빌드하십시오. 하나의 파일에 대해 파일을 생성하는 동시에 추가 클래스 또는 라이브러리 경로도 전달합니다.

답변

0

아마도 두 매크로을 사용하여 매크로를 분할 할 수 있습니다.

처음에는 쉼표로 구분 된 디렉토리 목록을 사용하고 그 중 하나에서 <union>을 생성합니다. 유니온을 id 속성으로 참조하는 데 사용할 refid을 제공합니다. 선택적 포함 및 제외가 있습니다.

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

예 사용 후 수 있습니다 뭔가 같은 :

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

을 그런 다음 매크로를 수정할 수 있습니다 dirs 속성을 사용하고 내부적으로 공용체와 클래스 경로를 생성하거나, 다른 곳에서 한 번 생성하고 참조를 전달하면됩니다.

이 그림에 @{root} 디렉토리를 포함 시키려하지 않았지만 위의 내용을 적용 할 수 있어야합니다.

+0

느린 반응에 사과드립니다. –

+0

하하, 걱정 마틴, 늦어도 응답은 항상 감사합니다. 필자는이 질문을 한 이후로 더 이상 같은 회사에 속해 있지 않지만 Ant 스크립트를 정기적으로 사용하며 scriptdef에 대해 전혀 몰랐습니다. – seaders