ディレクトリベースのタスク

いくつかのタスクは、実行するアクションにディレクトリツリーを使用します。たとえば、.javaファイルを.classファイルにコンパイルするディレクトリツリーをコンパイルするjavacタスクは、これらのディレクトリベースのタスクの1つです。これらのタスクの中には、ディレクトリツリーで非常に多くの作業を行うものがあるため、タスク自体が暗黙的なFileSetとして機能することができます。

ファイルセットが暗黙的かどうかにかかわらず、ディレクトリツリーのサブセットで作業することは非常に役立つことがよくあります。このセクションでは、これらのディレクトリベースのタスクのいずれかを使用する場合に、このようなディレクトリツリーのサブセットを選択する方法について説明します。

Apache Antでは、ファイルセット内のファイルのサブセットを作成するための2つの方法が提供されており、これらは同時に使用できます。

Patternset

ディレクトリベースのタスクは、場合によっては暗黙的な<fileset>として機能すると述べましたが、それに加えて、FileSetは暗黙的な<patternset>として機能します。

暗黙的なPatternSetのinclude要素とexclude要素は、ディレクトリベースのタスク(または明示的なfileset)内で、以下のいずれかを使用して指定できます。

外部ファイルを使用する場合、ファイルの各行は、includeまたはexcludeパターンのリストに追加されるパターンとして扱われます。

includeとexcludeの両方が使用されている場合、少なくとも1つのincludeパターンに一致し、excludeパターンに一致しないファイル/ディレクトリのみが使用されます。includeパターンが指定されていない場合、すべてのファイルはincludeパターンに一致するとみなされます(デフォルトのexcludeを除く可能性があります)。

パターン

前述のように、ファイルのincludeとexcludeにはパターンが使用されます。これらのパターンは、DOSとUNIXで使用されるパターンと非常によく似ています。

*は0文字以上の文字に一致し、?は1文字に一致します。

一般的に、パターンは、タスクに依存するベースディレクトリ(<fileset>の場合のdir属性)を基準とした相対パスとみなされます。そのベースディレクトリの下にあるファイルのみが考慮されます。そのため、../foo.javaのようなパターンは可能ですが、ベースディレクトリの親はファイルに対してスキャンされないため、適用しても何も一致しません。

*.java  は  .javax.javaFooBar.javaに一致しますが、FooBar.xmlには一致しません(.javaで終わっていません)。

?.java  は  x.javaA.javaに一致しますが、.javaxyz.javaには一致しません(両方とも.javaの前に1文字がありません)。

*?の組み合わせが許可されます。

一致はディレクトリごとに実行されます。これは、まずパターンの最初のディレクトリが、一致するパスの最初のディレクトリと一致することを意味します。次に、2番目のディレクトリが一致し、以下同様です。たとえば、パターンが/?abc/*/*.javaで、パスが/xabc/foobar/test.javaの場合、最初の?abcxabcと一致し、次に*foobarと一致し、最後に*.javatest.javaと一致します。すべてが一致するため、パスはパターンと一致します。

柔軟性を高めるために、複数のディレクトリレベルに一致できる追加機能を追加します。これを使用して、完全なディレクトリツリー、またはディレクトリツリー内の任意の場所にあるファイルを一致させることができます。これを行うには、**をディレクトリ名として使用する必要があります。**がパターン内のディレクトリ名として使用されている場合、0個以上のディレクトリに一致します。例:/test/**/test/の下にあるすべてのファイル/ディレクトリ(/test/x.java/test/foo/bar/xyz.htmlなど)に一致しますが、/xyz.xmlには一致しません。

1つの「省略形」があります。パターンが/または\で終わる場合、**が追加されます。たとえば、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
(foo/bar/部分は一致しません)
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を含む)に一致します。

これらのパターンをincludeとexcludeで使用すると、必要なファイルだけを選択する強力な方法が得られます。

セレクタ

ディレクトリベースのタスクで暗黙的か明示的かに関わらず、<fileset><and>セレクタコンテナとしても機能します。これは、タスクが処理するファイルに対して、任意に複雑な選択基準を作成するために使用できます。詳細については、Selectorのドキュメントを参照してください。

標準タスク/ファイルセット

Antの多くの標準タスクは、ここに示されているルールに従う1つ以上のファイルセットを受け取ります。これはそのサブセットであり、暗黙的なファイルセットとして機能できる標準的な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タスクは、暗黙的なファイルセットとして機能できます。

デフォルトの除外

すべてのディレクトリベースのタスクからデフォルトで除外される定義セットがあります。 *Ant 1.8.1以降*、それらは

**/*~
**/#*#
**/.#*
**/%*%
**/._*
**/CVS
**/CVS/**
**/.cvsignore
**/SCCS
**/SCCS/**
**/vssver.scc
**/.svn
**/.svn/**
**/.DS_Store

*Ant 1.8.2以降*、追加のデフォルトの除外は

**/.git
**/.git/**
**/.gitattributes
**/.gitignore
**/.gitmodules
**/.hg
**/.hg/**
**/.hgignore
**/.hgsub
**/.hgsubstate
**/.hgtags
**/.bzr
**/.bzr/**
**/.bzrignore

これらのデフォルトの除外を適用したくない場合は、defaultexcludes=no属性を使用して無効にすることができます。

これはデフォルトのリストです。 defaultexcludesタスクを使用して、デフォルトの除外のリストを変更できることに注意してください。