S-JIS[2009-02-06/2010-02-13] 変更履歴

Ant:サブルーチン呼び出しタスク

タスクの一部をサブルーチンのようにして呼び出すことが出来る。


targetのdepends属性

targetタグには、dependsという属性がある。
これは、自分のターゲットを実行する前に、準備(前提条件)として呼び出す為の別タスク(ターゲット)を指定するもの。

例えば、コンパイルする前にコンパイル先のディレクトリーを作っておく、といった用途に使用する。

<?xml version="1.0" encoding="EUC-JP"?>
<project name="depends_sample"  basedir="." default="compile">
	<property name="classes" location="../classes" />

	<target name="init">
		<mkdir dir="${classes}" />
	</target>

	<target name="compile" depends="init">
		<javac destdir="${classes}">
			<src path="../src" />
		</javac>
	</target>
</project>

depends属性には、カンマ区切りで複数のターゲット名を指定できる。
その場合、一番左に指定したものから順番にターゲットが実行される。


Ant:antcall

別ターゲットを呼び出すコアタスク。
(org.apache.tools.ant.taskdefs.CallTarget extends Task

別ターゲットにパラメーター(プロパティー)を渡してサブルーチンの様に使用する。
しかしそういう目的なら、macrodefの方がスマート。
(そもそもターゲットはantコマンドからターゲット名を指定して実行できるものなので、サブルーチンの様に使うのは違和感がある)

最新antcall
別ファイルのターゲットを呼び出すタスク

属性

属性 説明
target 呼び出すターゲット名。

ボディー部に入れられるタグ

タグ(使用例) 説明
<param name="プロパティー名" value="値" /> 呼び出した先で使用するプロパティーを設定する。
「param」という名前だが、実体はpropertyなので、propertyタグと同じ属性を設定できる。

C:\temp\fromの下のaaa,bbbというディレクトリーを順番にコピーする例。

<?xml version="1.0" encoding="Shift_JIS"?>
<project name="antcall_sample" default="copy_all" basedir="." >

	<target name="copy">
		<echo message="${dir}" />
		<copy todir="C:\temp\to\${dir}" preservelastmodified="true">
			<fileset dir="C:\temp\from\${dir}" />
		</copy>
	</target>

	<target name="copy_all">
		<antcall target="copy">
			<param name="dir" value="aaa" />
		</antcall>
		<antcall target="copy">
			<param name="dir" value="bbb" />
		</antcall>
	</target>
</project>

Ant:macrodef

複数のタスクをまとめてマクロを作るコアタスク(Ant1.6以降)。
(org.apache.tools.ant.taskdefs.MacroDef extends AntlibDefinition)

作ったマクロは、普通にタスクがあるかのようにbuild.xml上に書いて実行することが出来る。
(そういう意味ではtaskdefのような感じか)

最新macrodef

属性

属性 説明
name マクロ名。この名前をタスク名の様に使ってタスク呼び出しを記述する。

ボディー部に入れられるタグ

タグ(使用例) 説明
<attribute name="属性名" /> マクロ呼び出しで記述する属性を定義する。
ここで定義した属性は、「@{属性名}」で使用することが出来る。
<sequential>〜</sequential> マクロの内容を記述する。
すなわち、実際に実行されるタスクを書く。

C:\temp\fromの下のaaa,bbbというディレクトリーを順番にコピーする例。

<?xml version="1.0" encoding="Shift_JIS"?>
<project name="antcall_sample" default="copy_by_macro" basedir="." >

	<macrodef name="copy.mac">
		<attribute name="dir" />
		<sequential>
			<echo message="@{dir}" />
			<copy todir="C:\temp\to\@{dir}" preservelastmodified="true">
				<fileset dir="C:\temp\from\@{dir}" />
			</copy>
		</sequential>
	</macrodef>

	<target name="copy_by_macro">
		<copy.mac dir="aaa" />
		<copy.mac dir="bbb" />
	</target>
</project>

Ant:ant

別ファイル(build.xml)のターゲットを呼び出すコアタスク。[2010-02-13]
(org.apache.tools.ant.taskdefs.Ant extends Task

最新ant

属性 説明
antfile 呼び出すbuild.xmlファイルのパス。
target 呼び出すターゲットの名前。
dir 呼び出されるbuild.xmlのbasedir。
inheritAllがtrue(デフォルト)の場合、デフォルトは呼び出したbuild.xmlのカレントディレクトリー。
useNativeBasedir デフォルトはfalse。
trueにすると、同じbasedirを使用するようになる。(Ant1.8以降)
inheritAll true(デフォルト)の場合、全てのプロパティーが引き継がれる。

別ファイルを呼び出すbuild.xml(bin/build.xml)

<?xml version="1.0" encoding="Shift_JIS"?>
<project name="call sample" default="call" basedir=".">
	<property name="build.xml" location="../other/build.xml" />

	<target name="call">
		<ant antfile="${build.xml}" target="make_jar" />
	</target>
</project>

呼び出されるbuild.xml(other/build.xml)

<?xml version="1.0" encoding="Shift_JIS"?>
<project name="jar" default="make_jar" basedir=".">
	<property name="classes" location="../classes" />

	<target name="make_jar">
		<jar jarfile="sample.jar">
			<fileset dir="${classes}" includes="**/*.class" />
		</jar>
	</target>
</project>

この例の場合、呼び出されるbuild.xmlでは、sample.jarをカレントディレクトリーに作るよう記述されている。
この場合、呼び出し元のbuild.xmlのカレントディレクトリーにsample.jarが作られる。


Ant目次へ戻る / 技術メモへ戻る
メールの送信先:ひしだま