Ant FilterReader와 FilterChain설명

Ant의 FilterReader와 FilterChain은 Unix의 Pipe처럼 한쪽의 출력을 다른쪽의 입력으로 사용하기 위한 메커니즘으로, FilterReader로 읽어 들인것들을 FilterChain으로 묶어 다른 쪽의 입력으로 사용 할 수 있다. 

이해하기 쉽게  먼저 예제를 살펴보자.
<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는 ConcatCopyLoadFileLoadPropertiesMove 가 있으며, 각종 FilterReader들은 메뉴얼을 참조하면 된다.

아래 예제에서는 대상 디렉토리에서 복수개의 VisualStudio의 csproj파일을 복사하고 있는데, 이 때 파일을 그냥 복사하는게 아니라, 파일내의 내용을 특정 규칙에 맞추어 수정하고 복사하고 있다.

각 라인별로 “   <SccProjectName>어쩌고저쩌고</SccProjectName>“, ”   <SccLocalPath>어쩌고저쩌고</SccLocalPath>“,”   <SccProvider>어쩌고저쩌고</SccProvider>“이 들어간 부분은 공백처리하고,공백으로만 되어 있는 라인은 없앤 체로 복사하도록 하고 있다.

참고로 Ant는 스크립트를  XML형식으로 표시하다 보니 xml 태그에 관련된 문자는 별도로 주의 해서 표시 해주어야 한다.
(예 < 문자를 표현 하려면 &lt; 으로 표시)

<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>

 

댓글 남기기