幾つかのタスクではタスクを実行するためにディレクトリツリーを使います。
例えば、
ディレクトリツリーの.javaファイルを.classファイルに
コンパイルする
javacタスクは、ディレクトリベースのタスクの一つです。
これらのタスクはディレクトリツリーで多くのことを行うので、
タスク自身は暗黙のFileSetとして振舞います。
filesetは、暗黙的であろうとなかろうと、ディレクトリツリーのサブセットを とても便利を扱うのに、しばしばとても便利です。 この章では、ディレクトリを対象とするタスクの一つを利用するとき、 どうやって、ディレクトリツリーのサブセットを選択するのか、 について説明します。
Antは、filesetのファイルのサブセットを作成する2つの方法を提供しています。 同時には2つのうちどちらかを利用することができます。
includeパターンにマッチし、excludeパターンに
マッチしないファイルやディレクトリのみが含まれます。ディレクトリを対象とするタスクは、暗黙の<fileset>
として動作すると言いました。
しかし、付け加えると、FileSetは、暗黙の<patternset>
として実行されるのです。
暗黙のPatternSetの包括、除外の要素は、ディレクトリを対象とするタスク(あるいは暗黙のfileset)の中で、 次のように指定されます。
includesとexcludes属性<include>と<exclude>要素includesfileとexcludesfile属性で、外部ファイルで指定<includesfile>と<excludesfile>で、外部ファイルで指定外部ファイルを扱う場合は、ファイルの各行がパターンとみなされ、 包括や除外パターンに追加されます。
包括と除外の両方が使われた場合は、包括パターンにマッチしたファイルやディレクトリ の中で、除外パターンにマッチしないものを除いたものみが使われます。 もし、包括パターンが指定されていない場合は、包括パターンはすべてのファイルとみなされます (デフォルト除外集合を除いて)。
先に述べた通り、選択や除外のためにパターンが使われます。 これらのパターンは DOS や UNIX で使われるパターンとよく似ています:
'*' matches zero or more characters, '?' matches one character.
'*' は 0 かそれ以上の文字にマッチし、 '?' は一つの文字にマッチします。
*.java は .java、
x.java や FooBar.javaにマッチしますが、
FooBar.xmlにはマッチしません(.javaで終わっていなから).
?.java は x.javaや
A.javaにマッチしますが、.javaやxyz.java
にはマッチしません(.javaの前が1文字ではないから)。
複数の*や?の組み合わせも可能です。
マッチングはディレクトリごとに行われます。
これは、最初に、
パターン中の最初のディレクトリが、パス中の最初のディレクトリに対しマッチして、
次のディレクトリがマッチする、などです。
例えば、
/?abc/*/*.java
のようなパターンと
/xabc/foobar/test.java
なるパスがあった場合、
最初に?abcがxabcにマッチし、
次に*がfoobarにマッチし、
最後に*.javaがtest.javaにマッチします。
それらの全てがマッチして、そのパスがパターンにマッチしたことになります。
より柔軟に対応するために、
複数階層のディレクトリにマッチできるような機能を一つ加えました。
これは、ディレクトリツリー全体や、
あるディレクトリツリーの任意の場所にあるファイルにマッチするために使うことができます。
これを行うには、
ディレクトリ名として**を使わなければなりません。
パターン中で、ディレクトリ名として**が使われた場合、
これは 0 あるいはそれ以上のディレクトリとマッチします。
例えば:
/test/**
は、
/test/x.javaや
/test/foo/bar/xyz.htmlといった
/test/の下の全てのファイル/ディレクトリにマッチしますが、
/xyz.xmlにはマッチしません。
There is one "shorthand" - if a pattern ends
with /
or \, then **
is appended.
For example, mypackage/test/ is interpreted as if it were
mypackage/test/**.
一つの "省略記法" があります -
パターンが
/
や \で終わった場合、
**
が追加されます。
例えば、mypackage/test/ は
mypackage/test/**として解釈されます。
パターンの例:
**/CVS/* |
ディレクトリツリー中の任意の場所にあるCVSディレクトリの下の全てのファイルにマッチします。以下にマッチします
CVS/Repository
org/apache/CVS/Entries
org/apache/jakarta/tools/ant/CVS/Entries
が、以下にはマッチしません。
org/apache/CVS/foo/bar/Entries ( |
org/apache/jakarta/** |
org/apache/jakarta以下のディレクトリツリーにある全てのファイルにマッチします。以下はマッチします
org/apache/jakarta/tools/ant/docs/index.html
org/apache/jakarta/test.xml
が、以下にはマッチしません。
org/apache/xyz.java
(jakarta/の部分がない) |
org/apache/**/CVS/* |
org/apache以下のディレクトリツリーにあるファイルのうち、
CVSディレクトリの下にあるファイルがマッチします。以下はマッチします
org/apache/CVS/Entries
org/apache/jakarta/tools/ant/CVS/Entries
が、以下はマッチしません。
org/apache/CVS/foo/bar/Entries
(foo/bar/の部分がマッチしないから) |
**/test/** |
testというファイル名を含め、
パス中にtest要素がある全てのファイルにマッチします。 |
これらのパターンが(ファイルの)選択と除外の(両方に)使われた場合、 必要なファイルのみを選択する強力な方法を得たことになります。
<fileset>は、
ディレクトリを対象としたタスクの中で、暗黙であろうと明示的であろうと、
<and>
セレクターコンテナとして動作します。
これは、タスクが扱うファイルの複雑な選択条件を作成するのに使うことができます。
さらに多くの情報は、Selectorのドキュメントを参照してください。
Antの標準タスクの多くは、ここで言うルールに従う1つ以上のファイルセットを持ちます。 このリスト、これらのサブセットは、暗黙的なfilesetとして動作する標準Antタスクのリストです。
<copy todir="${dist}">
<fileset dir="${src}"
includes="**/images/*"
excludes="**/*.gif"
/>
</copy>
この例では、
${src}によって定義されるディレクトリ中の下の
imagesという名前のディレクトリにある全てのファイルを
${dist}により定義される出力先ディレクトリにコピーします。
しかしながら、*.gifファイルは全てコピーから除きます。
<copy todir="${dist}">
<fileset dir="${src}">
<include name="**/images/*"/>
<exclude name="**/*.gif"/>
</fileset>
</copy>
次は、上の例と同じですが、ネストした要素を使って表現しています。
<delete dir="${dist}">
<include name="**/images/*"/>
<exclude name="**/*.gif"/>
</delete>
オリジナルのファイルの集合が削除され、deleteタスクは暗黙のfilesetとして動作します。
次のものは、すべてのディレクトリを対象としたタスクで、デフォルトで除外される定義の集合です。
**/*~
**/#*#
**/.#*
**/%*%
**/._*
**/CVS
**/CVS/**
**/.cvsignore
**/SCCS
**/SCCS/**
**/vssver.scc
**/.svn
**/.svn/**
**/.DS_Store
もし、これらのデフォルト除外集合を適用したくなければ、
defaultexcludes="no"属性で、
無効にすることができます。
これはデフォルトのリストです。 defaultexcludesタスク を使ってデフォルト除外集合のリストは変更できることに注意してください。
Copyright © 2000-2004 The Apache Software Foundation. All rights Reserved.