몇 가지 기본 매개 변수, 대상, 루트 등을 사용하는 매크로 정의가있는 빌드 스크립트가 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 (또는 목표, 그것이 유일한 방법입니다)에서 템플릿을 빌드하십시오. 하나의 파일에 대해 파일을 생성하는 동시에 추가 클래스 또는 라이브러리 경로도 전달합니다.
느린 반응에 사과드립니다. –
하하, 걱정 마틴, 늦어도 응답은 항상 감사합니다. 필자는이 질문을 한 이후로 더 이상 같은 회사에 속해 있지 않지만 Ant 스크립트를 정기적으로 사용하며 scriptdef에 대해 전혀 몰랐습니다. – seaders