3. データ構造
Antでは、タスクを実行する際に、複数のファイルの集合に対して処理を行いたいということがしばしばあります。このような目的のために、Antには複数のファイル等の集合を表したりするためのデータ構造が存在します。
Ant1.5で利用できるデータ構造には次のようなものがあります。
| データ構造 |
説明 |
パス類似構造 |
PATHやCLASSPATHを指定するために用いられます。 |
セレクタ |
Filesetにおいて、ファイル名以外の基準でファイルの集合を選択する場合に用いられます。 |
description |
プロジェクトやターゲットの説明を記述します。 |
Dirset |
ディレクトリの集合を表します。 |
Exclude |
処理を除外するファイル名のパターンを表します。 |
Excludesfile |
処理を除外するファイル名のパターンを記述したファイルを表します。 |
Filelist |
ファイル名を列挙することで表現するファイルの集合です。 |
Fileset |
パターンやセレクタ等を用いて選択されるファイルの集合です。 |
Filter |
ファイルの内容の一部分を置換するためのフィルタを記述します。 |
FilterChain |
連続的に実行するフィルタを記述します。 |
Filterset |
フィルタの集合です。 |
Include |
処理の対象に含めるファイル名のパターンを表します。 |
Includefile |
処理書対象に含めるファイル名のパターンを記述したファイルを表します。 |
Mapper |
ファイル名の変換規則を記述します。 |
Patternset |
パターンの集合を表します。 |
Tarfileset |
Filesetを拡張したものです。ファイルのパーミッションやユーザ、グループ等の情報も扱うことができます。 |
XmlCatalog |
|
Zipfileset |
Filesetを拡張したものです。ZipやJarファイル内のアーカイブされたファイルの集合をあらわすことができます。 |
データ構造はタスクの動作を制御するためのものなので、タスクの子要素として定義するのが基本的な利用方法です。例えば、ファイルの削除を行うDeleteタスクでは、Deteleタスクの子要素として、削除対象のファイル集合を表したデータ構造を用います。
さらに、データ構造はプロジェクトやターゲットの子要素としても定義することもできます。このようなデータ構造は、それ自身ではビルド動作に何の影響も与えません。タスク内から参照されることによって初めて効力が生じます。この方法は、同じデータ構造を複数のタスクにおいて利用するのとき便利です。
3.1. パターン
上記の表をみると、いくつかのデータ構造で、パターンというものを利用してるのがわかると思います。ここではこのパターンについて説明します。
パターンは、Unixのシェルで用いるようなワイルドカード表現を利用した名前の集合の表現方法です。
パターンでは次の3つのワイルドカードが利用できます。
| ワイルドカード |
説明 |
? |
任意の1文字にマッチします。 |
* |
0文字以上の任意の文字列にマッチします。 |
** |
ファイルのディレクトリ構造において、任意の深さのあらゆるディレクトリやファイル名にマッチします。 |
「?」と「*」はUnixのシェルと同じように機能します。例えば、「Test??.*」というパタンを例として考えてみると、次のような名前にマッチします。
「Test??.*」に
マッチする名前 |
説明 |
Test01.txt |
「??」が「01」に対応し、「*」が「txt」に対応することでマッチします。 |
Tester.tar.gz |
「??」が「er」に対応し、「*」が「tar.gz」に対応することでマッチします。 |
Test... |
「??」が「..」に対応し、「*」が0文字の文字列に対応することでマッチします。 |
次のような名前にはマッチしません。
「Test??.*」に
マッチしない名前 |
説明 |
Test001.txt |
「??」が「00」に対応すると考えると、次の「.」と「1」がマッチしません。 |
FileTester.tar.gz |
先頭が「Test」で始まっていないので、マッチしません。 |
「**」はファイル構造に対応するために拡張されたAnt独特のワイルドカードです。ファイル構造においては、一つのパターンで「*」を利用したとき、特定のディレクトリ内の同じ階層のファイルにしかマッチしません。しかし、「**」は深さが0のディレクトリを含めた、あらゆる深さのディレクトリにマッチします。例として「image/**/*.png」というパターンを考えてみましょう。
「image/**/*.png」
にマッチするファイル |
説明 |
image/a/b/c/d.png |
「**」が「a/b/c」に対応し、「*」が「d」に対応することでマッチします。「*」がディレクトリ区切り文字「/」を含むことはできません。 |
image/e.png |
「**」が深さ0のディレクトリに対応し、「*」が「e」に対応することでマッチします。 |
「**」はパターンの最後に記述することで、ディレクトリだけでなくファイルにもマッチします。
「image/**」
にマッチするファイル |
説明 |
image/a/b/c/d.gif |
「**」が「a/b/c/d.gif」に対応することでマッチします。 |
image/e.jpg |
「**」が「e.jpg」に対応することでマッチします。 |
パタンの最後が「/」や「\」で終わっている場合は、暗黙的に最後に「**」が付加されているものとみなされます。たとえば、「image/」というパタンは、「image/**」と解釈され、imageディレクトリ以下のすべてのファイルにマッチします。