build.xml refactoring using macrodef tag

The ThoughtWorks Anthology 라는 책의 11 챕터의 빌드 아케텍트인 줄리안 심슨님의 내용은, build.xml 즉, ant 파일이 refactoring에 대한 내용입니다.  그 중에서, <macrodef> 태그를 이용한 build.xml 파일의 리펙토링 예제가 나오는데, 유용할것 같아서 개인적으로 사용하고 있는 dist target에 대해서 리펙토링을 적용해 봤습니다.

기존

<!– distribute compiled binary to dist folder –>
    <target name=”dist” depends=”compile” description=”distribute library”>
        <echo>dist target started</echo>
        <jar destfile=”${dist.dir}/${project.name}-${project.version}.jar”>
            <fileset dir=”${build.main.classes}”></fileset>
           
            <manifest id=”MANIFEST.MF”>
                 <attribute name=”Built-By” value=”${user.name}”/>
                 <!–attribute name=”Class-Path” value=”${class-path}” /–>   
             </manifest>
        </jar>
       
        <copy todir=”${dist.dir}”>
            <fileset dir=”${lib.dir}”>
                <exclude name=”junit*.jar” />
            </fileset>
        </copy>
       
        <!– compress binary –>
        <zip destfile=”${dist.dir}/${project.name}-${project.version}.zip” >
            <fileset dir=”${dist.dir}” includes=”**” />
        </zip>
        <echo>dist target completed</echo>
    </target>   

리펙토링된 후

    <macrodef name=”dist_jar”>
        <sequential>
            <jar destfile=”${dist.dir}/${project.name}-${project.version}.jar”>
                <fileset dir=”${build.main.classes}”></fileset>
                <manifest id=”MANIFEST.MF”>
                    <attribute name=”Built-By” value=”${user.name}”/>
                    <!–attribute name=”Class-Path” value=”${class-path}” /–>   
                </manifest>
            </jar>
        </sequential>
    </macrodef>
   
    <macrodef name=”dist_copy”>
        <sequential>
            <copy todir=”${dist.dir}”>
                <fileset dir=”${lib.dir}”>
                    <exclude name=”junit*.jar” />
                </fileset>
            </copy>
        </sequential>
    </macrodef>
   
    <macrodef name=”dist_zip”>
        <sequential>
            <!– compress binary –>
            <zip destfile=”${dist.dir}/${project.name}-${project.version}.zip” >
                <fileset dir=”${dist.dir}” includes=”**” />
            </zip>       
        </sequential>
    </macrodef>
   
    <!– distribute compiled binary to dist folder –>
    <target name=”dist” depends=”compile” description=”distribute library”>
        <echo>dist target started</echo>
        <dist_jar />
        <dist_copy />
        <dist_zip />
        <echo>dist target completed</echo>
    </target>   

위 예제처럼, 리펙토링된 내용을 살펴보면, <macrodef>태그를 통해서 기능에 대한 내용을 작게 쪼개서 빼고(<macrodef>) , 사용하는 <target>에서는 필요한 각 기능을 호출하는 템플릿 메쏘드(?)처럼 기술하게 됩니다. 어디서 많이 본 느낌인데.. 위는 기능을 작게 나눠서 메쏘드로 뽑는 extract method 리렉토링 기법과 동일하네요.. 역시 대가들에게서 많은 내용을 배우게 되는것 같습니다. ^^

build.xml refactoring using macrodef tag”에 대한 1개의 생각

  1. mcsong

    compile 시에는 아래처럼, main과 test 코드 분리를 파라미터 호출하는 형태로 refactoring 하면 좋을듯 하네요..











    compile target started


    compile target completed

    응답

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.