3. データ構造
- 2012/08/15 一部修正しました
- 3.1. パターン
- 3.2. パターンセット(PatternSet)
- 3.3. ファイルセット(FileSet)
- 3.4. デフォルト除外集合
Antでは、タスクを実行する際に、複数のファイルの集合に対して処理を行いたいということがしばしばあります。このような目的のために、Antには複数のファイル等の集合を表したりするためのデータ構造が存在します。
Ant1.5で利用できるデータ構造には次のようなものがあります。
データ構造 | 説明 |
---|---|
Filelist | ファイル名を列挙することで表現するファイルの集合です。 |
Fileset | パターンやセレクタ等を用いて選択されるファイルの集合です。 |
Patternset | パターンの集合を表します。 |
パス類似構造 | PATHやCLASSPATHを指定するために用いられます。 |
リソース | ファイルまたはファイルに似たものを抽象化した概念です。 |
リソースコレクション | リソースの集合です。バージョン1.8以降、FileListなど従来のデータ構造はリソースコレクションの一種という扱いになりました |
セレクタ | Filesetにおいて、ファイル名以外の基準でファイルの集合を選択する場合に用いられます。 |
データ構造はタスクの動作を制御するためのものなので、タスクの子要素として定義するのが基本的な利用方法です。例えば、ファイルの削除を行う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ディレクトリ以下のすべてのファイルにマッチします。