Ant FilterReader와 FilterChain설명
Ant의 FilterReader와 FilterChain은 Unix의 Pipe처럼 한쪽의 출력을 다른쪽의 입력으로 사용하기 위한 메커니즘으로, FilterReader로 읽어 들인것들을 FilterChain으로 묶어 다른 쪽의 입력으로 사용 할 수 있다.
이해하기 쉽게 먼저 예제를 살펴보자.
|
1 2 3 4 5 6 |
<loadfile property="target.list" srcFile="${src.list}" failonerror="true"> <filterchain> <ignoreblank/> <sortfilter reverse="true"/> </filterchain> </loadfile> |
- 위 예제는 ${src.list}파일을 읽어들여 target.list라는 속성에 읽어들인 파일의 내용을 세팅(로딩) 하고 있는데, 이 때 target.list에 그냥 세팅을 하는게 아니라, 먼저 해당파일의 공백 라인은 건너뛰고(ignoreblank 필터리더), 역(reverse) 소팅을 해서 (sortfilter 필터리더) 읽어들인 후, target.list에 세팅을 하고 있다.
- ignoreblank, sortfilter 두개의 필터리더가 하나의 filterchain으로 묶여 있고, loadfile Task가 이 nested element형태로 filterchain을 사용하고 있다.
Ant에서 FilterChain을 사용할 수 있는 Task는 Concat, Copy, LoadFile, LoadProperties, Move 가 있으며, 각종 FilterReader들은 메뉴얼을 참조하면 된다.
아래 예제에서는 대상 디렉토리에서 복수개의 VisualStudio의 csproj파일을 복사하고 있는데, 이 때 파일을 그냥 복사하는게 아니라, 파일내의 내용을 특정 규칙에 맞추어 수정하고 복사하고 있다.
각 라인별로 “ <SccProjectName>어쩌고저쩌고</SccProjectName>“, “ <SccLocalPath>어쩌고저쩌고</SccLocalPath>“,” <SccProvider>어쩌고저쩌고</SccProvider>“이 들어간 부분은 공백처리하고,공백으로만 되어 있는 라인은 없앤 체로 복사하도록 하고 있다.
참고로 Ant는 스크립트를 XML형식으로 표시하다 보니 xml 태그에 관련된 문자는 별도로 주의 해서 표시 해주어야 한다.
(예 < 문자를 표현 하려면 < 으로 표시)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
<target name="clean"> <mkdir dir="${to.dir}"/> <delete verbose="true"> <fileset dir="${to.dir}" includes="**/*"/> </delete> <!-- *.csproj 파일 copy--> <copy todir="${to.dir}" overwrite="true" verbose="true" force="true" encoding="ISO-8859-1"> <fileset dir="${from.dir}"> <include name="**/*.csproj"/> </fileset> <filterchain> <tokenfilter> <filetokenizer/> <replaceregex pattern=" <SccProjectName>(.*)</SccProjectName>" replace="" flags="gs" byline="false"/> </tokenfilter> <tokenfilter> <filetokenizer/> <replaceregex pattern=" <SccLocalPath>(.*)</SccLocalPath>" replace="" flags="gs" byline="false"/> </tokenfilter> <tokenfilter> <filetokenizer/> <replaceregex pattern=" <SccAuxPath>(.*)</SccAuxPath>" replace="" flags="gs" byline="false"/> </tokenfilter> <tokenfilter> <filetokenizer/> <replaceregex pattern=" <SccProvider>(.*)</SccProvider>" replace="" flags="gs" byline="false"/> </tokenfilter> <ignoreblank/> </filterchain> </copy> </target> |