2010-04-01

Ant 이야기

아파치 Ant를 쓴지도 8년이 넘었지만 제대로 파악하지 않고 대충 아는 지식에만 의존했기 때문에 항상 결과물에 모자람을 느껴왔다.

그러다 지금하는 일의 완성도를 높여야 한다는 당위성에 Ant에 시간 투자해서 얻은 경험 중 중요한 몇 가지를 정리해봤다.

Ant 작성에도 프로그래밍과 유사한 원칙들이 적용된다.

  • 내용 이해가 쉬워야 한다.
  • 중복된 내용이 없어서 변경하기 쉬워야 한다.

이런 원칙을 염두하고 다음 방법들을 사용했다.


이름을 명확하게


빌드 파일, 속성, 태스크 등의 이름을 길더라도 명확하게 설정한다.

예를 들어 테스크 이름을 copy로 하기보다는 copy_lib_to_web과 같이 명확하게 한다.


빌드 파일을 여러 개로 분리해서 모듈화 한다.

OOAD에서 클래스를 쪼개는 것과 동일하다. import 태스크와 antcall 태스크로 각 모듈을 효과적으로 조합할 수 있다.


라이브러리 작성

여러 빌드 모듈에서 사용하는 것들을 별도 파일에 정의한다. path 정보와 함수 역할을 하는 태스크 등이 여기에 해당된다.

라이브러리 모듈을 잘 작성하면 Ant 파일 내용을 크게 줄일 수 있다.

library.xml

<project name="library">

    <property file="build.properties" prefix="dimdol." />

    <path id="path.web.lib">
        <fileset dir="./lib">
            <include name="commons-fileupload-1.2.1.jar" />
            <include name="commons-io-1.4.jar" />
            <include name="commons-lang-2.4.jar" />
        </fileset>
    </path>

    <target name="library.compile">
        <javac srcdir="${source}"
               destdir="${target}"
               classpathref="${classpath}"
               source="${dimdol.compile.option.source}"
               target="${dimdol.compile.option.target}"
               debug="${dimdol.compile.option.debug}"
               encoding="${dimdol.compile.option.encoding}" />
    </target>

</project>

build_base.xml

<project name="build base" default="default">

    <import file="library.xml" />

    <target name="default">
        <antcall target="library.package_jar">
            <param name="source" value="${dimdol.base.src}" />
            <param name="target" value="${dimdol.base.target}" />
            <param name="classpath" value="path.web.lib" />
            <param name="jar" value="${dimdol.base.jar}" />
        </antcall>
    </target>

</project>

build_crm.xml

<project name="build crm" default="default">

   <import file="library.xml" />

   <target name="default">
       <antcall target="library.package_jar">
           <param name="source" value="${dimdol.crm.src}" />
           <param name="target" value="${dimdol.crm.target}" />
           <param name="classpath" value="path.web.lib" />
           <param name="jar" value="${dimdol.crm.jar}" />
       </antcall>
   </target>

</project>


컴파일을 담당하는 library.package_jar 태스크와 컴파일에 필요한 클래스 패스를 정의한 path.web.lib 패스를 library.xml 파일에 정의하고 build_base.xml, build_crm.xml 파일은 이 파일을 import한다.

* include가 더 유연하지만 Ant 1.8 부터 사용할 수 있다.


property는 properties 파일에 설정한다.

properties 파일에서도 ${}를 통해서 내용을 최소화한다.

build.properties

source = ./source
target = ./target
jar = ./jar

base.src = ${source}/base
base.target = ${target}/base
base.jar = ${jar}/base.jar

crm.src = ${source}/crm
crm.target = ${target}/crm
crm.jar = ${jar}/crm.jar

그런데 이 내용을 Ant 파일에서 사용할 때는 다른 많은 property와 쉽게 구분하기 위해서 prefix를 붙여 사용한다.

<property file="build.properties" prefix="dimdol." />

따라서 실제 사용할 때는 다음과 같이 한다.

<antcall target="library.package_jar">
   <param name="source" value="${dimdol.base.src}" />
   <param name="target" value="${dimdol.base.target}" />
   <param name="classpath" value="path.web.lib" />
   <param name="jar" value="${dimdol.base.jar}" />
</antcall>


No comments: