2010-03-05 2 views
1

나는 다른 곳에서 변종을 본 적이 있지만 내가 생각해 낸 답을 꽤 보지 못한 곳의 질문을 게시 할 것이다. 나는 나중에 내 대답을 게시 할 것이다.ANT. 속성을 재정의합니다. 단일 타겟에서 선택적 실행

매크로를 사용하여 빌드 스크립트를 모듈화하려면 updatetask와 동일한 매크로에서 최신이 아닌 경우 실행하려는 작업을 넣고 싶습니다.
어떻게해야합니까? 스크립트 태그를 사용하면 괜찮습니다. 전달되는 유일한 속성이 백 슬래시가 포함 된 경로이고 다른 호출에서 스크립트 태그에 다른 값을 전달할 수 있어야합니다. 백 슬래시가 관련되어있을 때 문자열 리터럴에서 발생할 수있는 문제를 피할 필요가 있습니다. 고유 한 특성을 사용하여 개미 불변의 속성 동작을 해결하고 일반적으로 두 개의 대상을 사용하여 처리 결정을 처리하는 앤트 패턴을 해결하고 문자열 리터럴의 백 슬래시 처리를 자바 스크립트로 처리해야합니다.

답변

2

참고 개미 1.7 함께 일하고 있습니다. 개미 1.8에서 지역 범위 지정을 사용하면 불변성이 그렇게 큰 도전이되지 않도록 몇 가지 추가 옵션이 있지만 이러한 다른 팁 중 일부는 여전히 유용 할 것입니다.

먼저 매크로에서 uptodate의 결과를 기반으로 작업을 선택적으로 실행하는 문제에 관해서 - 즉 2 개의 대상이 필요하지 않음을 의미합니다. 이렇게하려면 조건 태그를 사용하십시오. < 또는 > 태그는 첫 번째 조건이 실패 할 경우에만 두 번째 조건을 실행하게합니다. <scriptcondition> 태그는 자바 스크립트를 사용하여 다른 개미 작업을 실행할 수있게합니다.

<condition property="whatever" value="false"> 
    <or> 
    <uptodate> 
     <srcfiles dir="@{srcdir}" includes="@{srcincludes}" excludes="@{srcexcludes}"/> 
     <mapper><chainedmapper> 
     <flattenmapper/><!-- use any mappers you need to match source to target files--> 
     <globmapper from="*.jxw" to="@{targetdir}\*W.java"/> 
     </chainedmapper></mapper> 
    </uptodate> 
    <!-- w/ java 1.6 or later, you get a rhino javascript interpreter included w/ java--> 
    <scriptcondition language="javascript" value="true"> 
     self.setValue(true); 
     echo = project.createTask("echo"); 
     myArg1="@{myArg1}"; 
     myArg2="@{myArg2}"; 
     // need to create a reference from a classpath refid 
     myReference = new org.apache.tools.ant.types.Reference(project,"@{my.classpath.id.string}"); 
     // get a handle to the ant java task, which we will use to execute a java program 
     javaTask = project.createTask("java"); 
     javaTask.setFork(true); 
     javaTask.setFailonerror(true); 
     javaTask.setClassname("com.mycompany.mypackage.MySpecialClass"); 
     javaTask.setClasspathRef(myReference); 
     javaTask.createArg().setValue(myArg1); 
     javaTask.createArg().setValue(myArg2); 

     //output the command line to standard out, for reference 
     echo.setMessage(javaTask.getCommandLine()); 
     echo.perform(); 
     javaTask.perform(); 
    </scriptcondition> 
    </or> 
</condition> 

당신이 나 같은 경우, 당신은 당신의 macrodef 입력하고 참조 할 수있는 몇 가지 파생 된 값을 생성하는 속성을 일부 처리를 수행 할 수 있습니다, 지금 예를 들면 : (@ 태그 macrodef 특성을 나타냅니다)입니다 매크로 정의 스크립트에서. 처리중인 경우 단순히 속성과 문자열을 결합하는 작업이 포함 된 경우 연결 단계가 포함 된 기본 설정으로 두 번째 속성 집합을 지정하도록 속성을 지정 했더라도이를 수행 할 수 있습니다. 그러나 속성 기본값에 연결할 수없는 작업을 수행해야하는 경우 속성에 속성을 추가해야합니다. 속성은 변경할 수 없으므로 속성에 고유 한 이름을 지정하기 위해 몇 가지 추가 단계를 수행해야합니다. tstamp가 도움이됩니다. 일반적으로 매크로에 전달 된 매개 변수의 일부 조합은 고유하지만이 고유 조합이 백 슬래시를 포함하는 경우 tstamp 태그를 사용하여 보조 고유 식별자를 유도하여 자바 스크립트에서 백 슬래시 문제가 발생하지 않도록해야합니다. 이러한 파생 된 속성을 사용하려고합니다. 스크립트에서 쉽게 참조 할 수있는 고유 한 속성을 만드는 방법은 다음과 같습니다. 나는 위의 해결책을 오기 전에

<macrodef name="public.macro.example"> 
    <attribute name="srcpath"/> 
    <sequential> 
     <tstamp prefix="@{srcpath}"><format pattern="ddhhmmssSSS" property="time"/></tstamp> 
     <private.macro.example srcpath="@{srcpath}" propertyPrefix="prop${@{srcpath}.time}"/> 
    </sequential> 
</macrodef> 

<macrodef name="private.macro.example"> 
    <attribute name="srcpath"/> 
    <attribute name="prefix"/> 
    <sequential> 
    <pathconvert property="@{prefix}.src"/> 
    <!-- now you can do special things with ${@{prefix}.src}, even in javascript --> 
    <script language="javascript"> 
     self.setValue(true); 
     echo = project.createTask("echo"); 
     myPrefix="@{prefix}"; 
     mySpecialPropertyKey=myPrefix+".src"; 
     //if your special property contains backslashes or other special js characters 
     // you need to use project.getProperty instead of a string literal to get the value 
     mySpecialPropertyVal=project.getProperty(mySpecialPropertyKey); 
     // do something with this derived value in javascript 
     echo.setMessage("my special property = "+mySpecialPropertyVal); 
     echo.perform(); 
    </script> 
    </sequential> 
</macrodef> 

, 나는 새 값으로 개미 속성을 재정의하기위한 솔루션의 해킹 스타일 함께했다. 이 방법을 사용하면 속성을 재정의하는 것이 유용 할 수 있지만, 개미 클래스에 대한 직접 호출을하기 때문에 개미의 이후 버전에서도 동일하게 작동하지 않을 수 있습니다. 이것은 더 많은 해킹처럼 보이기 때문에 가능한 경우이 방법보다는 위에 나열된 2 가지 매크로 정의 방법을 사용하는 것이 나의 목적입니다. 이 특정 변형은 자바 스크립트 문자열 리터럴에서 속성을 직접 참조하기 때문에 백 슬래시 문자는 지원하지 않습니다. 이 간단한 변형을 사용하여 고유 한 접두어를 만들었습니다. 이로 인해 속성 불변 성을 해결하기위한 2 매크로 정의 방법이 필요하지 않게되었습니다. 그러나이 macrodef를 두 번째 macrodef와 고유 접두사를 사용하여 javascript에 "@ {value}"를 얻기 위해 project.getProperty 명령을 사용하여 적용 할 수 있습니다.

언뜻
<macrodef name="public.canova.setproperty"> 
    <attribute name="name"/> 
    <attribute name="value"/> 
    <sequential> 
    <script language="javascript"> 
     project.setUserProperty("@{name}","@{value}"); 
    </script> 
    <sequential> 
</macrodef> 

,이 중 일부는 조금 복잡 보일지도 모르지만, 당신이 당신의 macrodef 작업 오른쪽을하고 (즉, 매크로에 스파게티 코드를 삽입하지 않습니다) 구성 요소 스타일 매크로를 구축 할 경우, 귀하의 개미 스크립트해야 실제로 더 짧고 이해하기 쉽고 유지 보수가 쉽고 로그를 쉽게 따라 할 수 있습니다. 팁 - 필요할 때만 자바 스크립트를 사용하고 매크로를 사용할 때 자바 스크립트를 사용하여 개미 스크립트의 주요 '논리'에서 캡슐화되고 숨겨 지도록하여 매크로 내에서 사용하는 것이 더 바람직합니다. 따라서 자체 문서화 및 읽기 쉽도록 지원합니다. 귀하의 주요 '논리'. 사물이 명백하지 않을 때 주석을 사용하십시오.

+0

이 기술의 한 가지 문제점. @ {value}은 스크립트에서 문자열 리터럴로 인라인됩니다. 따라서 값에 백 슬래시 또는 큰 따옴표가 포함되어 있으면 예상대로 결과가 표시되지 않습니다. – gawi

+7

이 게시물은 오래된 게시물 인 것으로 알고 있지만 이메일 주소를 포함시키려는 요청은 [다른 사람들이 내 게시물을 편집 할 수 있습니까?] (http://stackoverflow.com/faq#editing)를 참조하십시오. 확실히) 그리고 [포스터가 사용된다면 코드에 대한 신용을 원할 때 대답을 어떻게 처리 할 것인가?] (http://meta.stackexchange.com/questions/117084/how-to-handle-answer-where-poster-wants-credit -for-code-if-used) – Arjan

관련 문제