目次へ

3.2. パターンセット(PatternSet)

パターンセットは複数のパターンを用いてファイルの集合を扱うデータ構造です。一つのパターンでは表現できない複雑な条件でファイルの集合を定義したいときに用います。パターンセットでは、集合に含めたい名前を表すパターンと、集合に含めたくない名前を表すパターンをそれぞれ複数組み合わせて用いることができます。たとえば、名前が「Test」または「Temp」で始まっているが「.java」や「.class」では終わっていないファイル、というような複雑な条件を表現することができます。

パターンセットは<patternset>要素として記述します。パターンセットの属性は次の通りです。

属性名 説明 必須
includes
集合に含めたい名前のパターン。コンマ区切りまたはスペース区切りで複数のパターンを記述することができます。省略時はすべてのファイルが含まれたとみなされます。
 
includesfile
集合に含めたい名前のパターンを記述したファイル。  
excludes
集合から除外したい名前のパターン。コンマ区切りまたはスペース区切りで複数のパターンを記述することができます。省略時は何も除外されません。  
excludesfile
集合から除外したい名前のパターンを記述したファイル。  
refid
別の場所で定義されたパターンセットを参照するときに用います。参照されるパターンセットは、id属性で名前が定義されていなければいけません。(この表にはid属性を書いていませんが、id属性はすべてのデータ構造要素で用いることができます。)  

パターンセットは次の要素を子要素として持つことができます。

  • include
  • includesfile
  • exclude
  • excludesfile
  • patternset

先ほどの、名前が「Test」または「Temp」で始まっているけど「.java」や「.class」では終わっていないファイル、という集合は次のようなパターンセットで表現されます。

<patternset includes="Test*,Temp*" excludes="*.java,*.class" />

集合に含めたいパターンや除外したいパターンは、パターンセットの子要素としても指定することができます。上記の例は次のように書き直すことができます。

<patternset>
  <include name="Test*,Temp*" />
  <exclude name="*.java,*.class" />
</patternset>

<include>要素はincludes属性、<exclude>要素はexcludes属性、<includesfile>要素はincludesfile属性、<excludesfile>要素はexcludesfile属性にそれぞれ対応します。これらの要素では、パターンやパターンの書かれたファイル名などをname属性を用いて記述します。

この例のように一つの子要素で複数のパターンを記述しても良いですし、同じ種類の複数の要素を並べて記述しても構いません。上記のパターンセットは次のようにも書き換えることができます。

<patternset>
  <include name="Test*" />
  <include name="Temp*" />
  <exclude name="*.java" />
  <exclude name="*.class" />
</patternset>

パターンセット同様、<include><exclude><includesfile><excludes>要素においても、id属性やrefid属性を用いることができます。また、ターゲットのようにif属性やunless属性を用いて、特定のプロパティの有無によって機能を有効にしたり無効にしたりすることもできます。

3.3. ファイルセット(FileSet)

ファイルセットはファイルの集合を扱うデータ構造です。パターンセットとの違いは、ベースディレクトリを持っていることです。ベースディレクトリがあり、そこからの相対位置をパターンセットで表現したものと考えたらよいでしょう。

ファイルセットの属性は次の通りです。

属性名 説明 初期値 必須
dir
ファイル集合のベースディレクトリです。
 
defaultexcludes
デフォルト除外集合をファイル集合から除外するかどうかを指定します。
yes
 

includes

FileSetに含めたいファイルのパターン。
 
 
includesfile
FileSetに含めたいファイルのパターンを記述したファイル。
 
 
excludes
FileSetから除外したいファイルのパターン。
 
 

excludesfile

FileSetから除外したいファイルのパターンを記述したファイル。
 
 
casesensitive
英文字の大文字と小文字を区別するかどうかを指定します。
true
 
followsymlinks
シンボリックリンクをたどるかどうかを指定します。
true
 

ファイルセットは次の要素を子要素として持つことができます。

  • include
  • includesfile
  • exclude
  • excludesfile
  • patternset
  • セレクタ

ファイルセットではdir属性を必ず指定しなければいけません。そこからの相対位置の表現方法はパターンセットとほとんど同じです。

ここでは子要素としてパターンセットを用いる方法を見てみましょう。パターンセットは、事前に定義されたパターンの集合を再利用したいとき、またはここで定義したパターンの集合を別の場所で再利用したい場合に有用です。

例として、${src}ディレクトリ以下のあらゆる深さのディレクトリに存在するファイルで、名前は「Test」で始まるが「.log」では終わらないファイルの集合を考えてみましょう。再利用を考えないのであれば、パターンセットを用いずに次のように書けば良いでしょう。

<fileset dir="${src}" includes"**/Test*" excludes="**/*.log" />

もしくは

<fileset dir="${src}">
  <include name="**/Test*" />
  <exclude name="**/*.log" />
</fileset>

しかし、複数の場所で同じパターンの集合によって表現されたファイル集合を扱うのなら、パターンセットを用いるのが便利です。例えば、${src}と${another.src}という二つの異なるベースディレクトリに対して、同じパターン集合を適用した二つのファイルセットを定義する場合、次のように記述することができます。

<fileset dir="${src}">
  <patternset id="testfiles">
    <include name="**/Test*" />
    <exclude name="**/*.log" />
  </patternset>
</fileset>
<fileset dir="${another.src}">
  <patternset refid="testfiles">
</fileset>

もしくは

<patternset id="testfiles">
  <include name="**/Test*" />
  <exclude name="**/*.log" />
</patternset>
<fileset dir="${src}">
  <patternset refid="testfiles">
</fileset>
<fileset dir="${another.src}">
  <patternset refid="testfiles">
</fileset>

この例はそれほど複雑ではないので、パターンセットを使わないほうが簡単に見えるかも知れません。しかし、パターンが複雑なときや、多くの個所で同じパターンを再利用していて、パターンを変更したときにすべての個所で変更を適用したいときなどは、パターンセットを用いた方が便利です。パターンセットを再利用したほうがビルドファイルをメンテナンスしやすくなります。

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp
  • シナジーマーケティング研究開発グループブログ