Ant- property 값 변경

Ant에서 한번 값을 세팅한 property값을 변경하는 것은 불가능하다.(Properties are immutable: whoever sets a property first freezes it for the rest of the build; they are most definitely not variables.) 따라서 변수처럼 수시로 값을 변경하면서 사용할 수 없다.

이에 대한 대안으로서 antcontlib에서는 Variable Task 를 제공하고 있다. (var는 값의 변경이 가능하다)

평소에는 antcontrib의 var를 써도 되지만 어떤 특정한 상황에서는 var를 못 쓰고, property에 값을 계속 세팅하면서 사용해야 하는 경우가 있다.

이를테면 Ant에서 for등을 이용하여 loop를 돌면서 어떤 특정 Task를 수행해야 하는데, for에서 delimeter로 파싱된 각각의 값을 loop내 특정 Task의 param으로 사용하고자 하는 경우에는 var를 사용할 수 없다.
for 자체가 property에 값을 세팅하지, var에는 값을 세팅 못 하기 때문이다.

쉽게 이해하기 위해 아래 예제를 보자.
아래의 예제의 경우 ${private.list} 파일을 읽어들여, target.list.co 속성에 읽어들인 내용을 세팅한다.(읽어들일 때 filterchain이용)

읽어들이는 파일은 각  내용은 특정 디렉토리에 있는 파일들의 경로명을 라인별로 갖고있다.

각 라인별로 읽어들인 파일 경로명에서 바로 상위 디렉토리 경로명을 추출하며, 추출된 경로명으로 특정 Taks(아래 예제에서는 java)를 실행해야 하는 데, 추출된 경로를 임시로 지정할 변수 비슷한 마땅한 것이 없다.
이 경우 antcontrib의 var를 쓸 수 없는 것이, for 타스크에서 delimeter로 추출한 값을 property에 세팅은 가능하지만, var에는 세팅이 안되기 때문이다.
loop를 돌 때마다 property에 세팅된 값들은 계속 변경이 되어야 하는데, property의 immutable속성 상 이전에 세팅된 값을 변경할 수 가 없다.

그런데 이 때 알게된 놀라운 한 가지!
<scriptdef>에서 javascript를 이용하여, property에 값을 세팅했을 때는 계속 property의 값을 변경할 수 있다.

하기 예제에서  javascript는 상위 디렉토리를 추출하기 위해서 보다는 loop를 수행하면서 동적으로 property의 값을 변경하고자 하는 용도 때문에 사용한 경우이다.

<scriptdef>에 대한 추가 내용은 여기(Ant – javascript사용)를 참조.

<?xml version="1.0" encoding="UTF-8"?>

<project name="Build Steper Ant Script" basedir=".">
	<description>query view private and add to source control</description>

	<taskdef resource="net/sf/antcontrib/antlib.xml"/>

	<target name="get.view.private">
		<loadfile property="target.list.co"  srcFile="${private.list}" failonerror="true">
			<filterchain>
				<ignoreblank/>
				<sortfilter/>
			</filterchain>
		</loadfile>
		<for list="${target.list.co}" param="each.item" delimiter="${line.separator}">
			<sequential>
				<property name="each.item.upper.dir" value=""/> 
				<setupperdir file.path="@{each.item}" />
				<java classname="com.ke.test.CCMgr" failonerror="true"   output="${checkout.list}" append="true">
					<arg value="${upper.dir}"/>
					<arg value="${exec.dir}"/>
					<classpath>
						<pathelement location="./cc.batch.jar"/>
					</classpath>
				</java>
			</sequential>
		</for>

	</target>

	<!-- javascript를 이용 형상항목들의 바로 위 경로 추출 및 프로퍼티 동적 세팅-->
	<scriptdef name="setupperdir" language="javascript">
		<attribute name="file.path" />

		<![CDATA[
			var temp=attributes.get("file.path");
			var lastIdx=temp.lastIndexOf("\\");
			temp=temp.substring(0,lastIdx);

			upperDir=temp;
			project.setProperty("upper.dir", upperDir);

		]]>
	</scriptdef>
</project>

 

댓글 남기기