참고 개미 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 작업 오른쪽을하고 (즉, 매크로에 스파게티 코드를 삽입하지 않습니다) 구성 요소 스타일 매크로를 구축 할 경우, 귀하의 개미 스크립트해야 실제로 더 짧고 이해하기 쉽고 유지 보수가 쉽고 로그를 쉽게 따라 할 수 있습니다. 팁 - 필요할 때만 자바 스크립트를 사용하고 매크로를 사용할 때 자바 스크립트를 사용하여 개미 스크립트의 주요 '논리'에서 캡슐화되고 숨겨 지도록하여 매크로 내에서 사용하는 것이 더 바람직합니다. 따라서 자체 문서화 및 읽기 쉽도록 지원합니다. 귀하의 주요 '논리'. 사물이 명백하지 않을 때 주석을 사용하십시오.
이 기술의 한 가지 문제점. @ {value}은 스크립트에서 문자열 리터럴로 인라인됩니다. 따라서 값에 백 슬래시 또는 큰 따옴표가 포함되어 있으면 예상대로 결과가 표시되지 않습니다. – gawi
이 게시물은 오래된 게시물 인 것으로 알고 있지만 이메일 주소를 포함시키려는 요청은 [다른 사람들이 내 게시물을 편집 할 수 있습니까?] (http://stackoverflow.com/faq#editing)를 참조하십시오. 확실히) 그리고 [포스터가 사용된다면 코드에 대한 신용을 원할 때 대답을 어떻게 처리 할 것인가?] (http://meta.stackexchange.com/questions/117084/how-to-handle-answer-where-poster-wants-credit -for-code-if-used) – Arjan