그러다 지금하는 일의 완성도를 높여야 한다는 당위성에 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>
<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>
<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>
<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
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>
<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:
Post a Comment