Ant による自動化メモ::extension-point 編で見たとおり、extension-point を使いだすと自然と build.xml を分割したくなります。そこで、実際に build.xml を分割して運用する場合の勘所などをメモします。
動機
build.xml がゴチャゴチャしてきたので分割したいのです。分割した build-*.xml は必要に応じて取り込んだり取り込まなかったりといった制御がしたいのです。
外部ビルドファイルの読み込み(おさらい)
外部ビルドファイルを読むには、import もしくは include を使います。どちらも、トップレベルでしか使うことができません。要するに、target の中には置けないということですね。
<import file="sub1.xml"/>
<include file="sub2.xml"/>
import された内容はそのまま build.xml に取り込まれます。よって、build.xml の target を上書きすることもできます。
一方、include された内容はプロパティやターゲットに接頭辞(デフォルトはファイル名)が付与されるため、build.xml 側の target を上書きすることはできません。
import は build.xml と同じ名前空間を汚染可能で、include は必ず専用の名前空間を割り当てられるイメージですね。
用途に応じて使えばいいと思うのですが、今回はより自由度(≒危険度)の高い import を使います。
build.xml で外部ビルドファイルを自動的に読み込む
自動的に外部ビルドファイルを読み込むには、それらがパターン化されれば良いわけなので、まずは外部ビルドファイルを sub-build ディレクトリ以下に置くと決めます。また、ビルドファイルは xml なので、拡張子も .xml で決まりです。
あとはこの条件を満たすファイルを選択するだけですが、ant にはこういった用途に使える道具として fileset があります。
<fileset dir="sub-build" includes="*.xml"/>
これで、必要なファイルを選択することができます。
<import optional="true">
<fileset dir="sub-build" includes="*.xml"/>
</import>
optional="true" はファイルが存在しなくても処理を中止しないようにするオプションです。
なお、fileset は import 専用というわけではなく、ファイル群を相手にするさまざまな task で利用可能です。いろんな場面で登場するので、自然と使えるようになるでしょう。
import するビルドファイルを取捨選択したい(build.xml を変えずに)
予定していた機能の完成が遅れたり、中途半端な状態でチェックインされたコンポーネントがビルドできなかったり、batch のデプロイ環境がまだ準備されていないので今だけは外しておきたい、なんてことが、わりとよくあります(good ではないけれど)。
そんなときにはひとまず、コンポーネント単位でビルド・デプロイ対象から外すことができれば便利ですね。もちろん、build.xml は変えたくないわけです。
そこでまずは、import したいビルドファイルを指定できるようにします。
# 必要に応じて import するコンポーネントを下記から選択(デリミタはパイプ)
#
# client -- .NET クライアント
# server -- JAX-WS サービス群
# webapp -- Spring MVC アプリケーション
# batch -- バッチコンポーネント群
#
# 例)サーバーとバッチを指定する場合
# deploy.import=server|batch
deploy.import=client|server|webapp|batch
build.xml ではこの設定を読み込み、それに基づき import するようにします。
<property file="build.properties"/>
<import optional="true">
<fileset dir="sub-build">
<filename regex="^(${deploy.import})\.xml$"/>
</fileset>
</import>
property で外部設定ファイルを読み込んでいます。この結果、deploy.import プロパティが定義されます。また、fileset がブロック化され、filename で選択すべきファイルを正規表現で指定しています。
<filename regex="^(${deploy.import})\.xml$"/>
の部分は、読み込んだ ${deploy.import} が展開されて
<filename regex="^(client|server|webapp|batch)\.xml$"/>
となるわけです。filename は selector の一種で、ほかにも、date や size といった selector が用意されています。意味はわかりますよね。
これで、build.properties を変更するだけで import したいビルドファイルを選択できるようになりましたとさ。めでたしめでたし。
まとめ
- 外部ビルドファイルは柔軟に import できるようにしよう
- 設定は build.properties に外だししよう
- ant って結構練れてるよね