Ant/Condition のバックアップの現在との差分(No.5)
TITLE:Antで条件分岐
Antで条件分岐
編集者:Terai Atsuhiro~
作成日:2007-03-13
更新日:2024-01-19 (金) 11:15:36
- title: AntでConditionタスクを使った条件分岐を行う author: aterai pubdate: 2007-03-13 description: Conditionタスクを使って、Targetタスクを実行するかどうかを振り分けます。
Conditionタスクで条件分岐
Conditionタスクを使って、例えばディレクトリの有無などによる条件で、Targetタスクを実行するかどうかを振り分けます。概要
Condition
タスクを使って、例えばディレクトリの有無などによる条件で、Target
タスクを実行するかどうかを振り分けます。
サンプルターゲット
Script
タスクを使用する方法は、AntのScriptタスク中でif文を使った条件分岐を行うに移動しました。
サンプルターゲット
<!-- リソースディレクトリが存在すれば、プロパティ:have.resourcesは真 -->
<condition property="have.resources">
<available file="${res.dir}" />
</condition>
<!-- ターゲット:prepare-resourceは、プロパティ:have.resourcesが
真の場合実行される -->
<target name="prepare-resource" depends="prepare" if="have.resources">
<!-- 以下、ビルド用のリソースディレクトリを作って、リソースをコピー -->
<mkdir dir="${build.res}" />
<native2ascii encoding="UTF-8" src="${res.dir}" dest="${build.res}"
includes="**/*.properties.utf8" ext="" />
<copy todir="${build.res}">
<fileset dir="${res.dir}" excludes="**/*.properties.*, **/*.bak" />
</copy>
</target>
...省略...
<!-- ターゲット:compileで、ターゲット:prepare-resourceは呼び出されるが、
実行されるされるかどうかはプロパティ:have.resourcesの値による -->
実行されるかどうかはプロパティ:have.resourcesの値による -->
<target name="compile" depends="prepare-src, prepare-resource">
<javac srcdir="${build.src}"
destdir="${build.dest}"
encoding="${compile.encoding}"
debug="${compile.debug}"
optimize="${compile.optimize}"
source="${compile.source}"
deprecation="${compile.deprecation}"
classpathref="project.class.path"
/>
</target>
解説
上記のサンプルでは、Conditionタスクを使って、プロパティ:have.resourcesに真偽を代入しています。 ターゲット:prepare-resourceは、propertiesファイルをユニコードエスケープしますが、これは、プロパティ:have.resourcesが真(if="have.resources")の場合だけ実行されます。このため、リソースディレクトリが無い(エスケープするpropertiesファイルが無い)場合、あとでcompileターゲットで、ターゲット:prepare-resourceは呼び出されていますが、何もしないというサンプルになっています。解説
上記のサンプルではCondition
タスクを使用してhave.resources
プロパティに真偽を代入しています。
-
prepare-resource
ターゲットはproperties
ファイルをユニコードエスケープし、have.resources
プロパティが真(if="have.resources"
)の場合のみ実行 - このためリソースディレクトリが存在しない(エスケープする
properties
ファイルがない)場合、compile
ターゲットでprepare-resource
ターゲットが呼び出されて何も実行しない
以下は、同様にConditionタスクを使って、libディレクトリが存在する場合、その下にあるjarファイルをパスに含めるように上書きするためのサンプルです。 以下は、同様に
Condition
タスクを使って、lib
ディレクトリが存在する場合、その下にあるjar
ファイルをパスに含めるように上書きするためのサンプルです。
<path id="project.class.path">
<pathelement location="${build.dest}" />
<pathelement path="${java.class.path}" />
</path>
<condition property="have.library">
<available file="${lib.dir}" />
</condition>
<target name="init" if="have.library">
<path id="project.class.path">
<pathelement location="${build.dest}" />
<fileset dir="${lib.dir}">
<include name="*.jar" />
</fileset>
<pathelement path="${java.class.path}" />
</path>
</target>
参考リンク
- JToolBarでアイコンボタンを右寄せの、src.zipなどを参照
Scriptタスクで条件分岐
Conditionタスクの条件が複雑になるようなら、以下のようにして <script language="javascript">タスクなどでif文を使う方法もあります。参考リンク
- Conditions Task
- If and Unless on all tasks/nested elements
-
Ant 1.9.1
からタスクなどにif
、unless
属性を使用可能になった
-
サンプルターゲット
#spanend
#spandel
<target name="prepare-resource" depends="prepare">
#spanend
<script language="javascript"><![CDATA[
importClass(java.io.File);
if(new File(project.getProperty("res.dir")).exists()) {
project.executeTarget("copy-resource");
}
]]></script>
#spandel
</target>
#spanend
#spandel
<target name="copy-resource">
#spanend
<mkdir dir="${build.res}" />
<copy todir="${build.res}">
<fileset dir="${res.dir}" excludes="**/*.properties.*, **/*.bak" />
</copy>
#spandel
</target>
#spanend
#spandel
コメント
-
Script
タスクを使用する方法は、AntのScriptタスク中でif文を使った条件分岐を行うに移動しました。 -- aterai