いくつかのタスクは、実行するアクションにディレクトリツリーを使用します。たとえば、.javaファイルを.classファイルにコンパイルするディレクトリツリーをコンパイルするjavacタスクは、これらのディレクトリベースのタスクの1つです。これらのタスクの中には、ディレクトリツリーで非常に多くの作業を行うものがあるため、タスク自体が暗黙的なFileSetとして機能することができます。
ファイルセットが暗黙的かどうかにかかわらず、ディレクトリツリーのサブセットで作業することは非常に役立つことがよくあります。このセクションでは、これらのディレクトリベースのタスクのいずれかを使用する場合に、このようなディレクトリツリーのサブセットを選択する方法について説明します。
Apache Antでは、ファイルセット内のファイルのサブセットを作成するための2つの方法が提供されており、これらは同時に使用できます。
ディレクトリベースのタスクは、場合によっては暗黙的な<fileset>
として機能すると述べましたが、それに加えて、FileSetは暗黙的な<patternset>
として機能します。
暗黙的なPatternSetのinclude要素とexclude要素は、ディレクトリベースのタスク(または明示的なfileset)内で、以下のいずれかを使用して指定できます。
<include>
と<exclude>
。<includesfile>
と<excludesfile>
で指定された外部ファイル。外部ファイルを使用する場合、ファイルの各行は、includeまたはexcludeパターンのリストに追加されるパターンとして扱われます。
includeとexcludeの両方が使用されている場合、少なくとも1つのincludeパターンに一致し、excludeパターンに一致しないファイル/ディレクトリのみが使用されます。includeパターンが指定されていない場合、すべてのファイルはincludeパターンに一致するとみなされます(デフォルトのexcludeを除く可能性があります)。
前述のように、ファイルのincludeとexcludeにはパターンが使用されます。これらのパターンは、DOSとUNIXで使用されるパターンと非常によく似ています。
*
は0文字以上の文字に一致し、?
は1文字に一致します。
一般的に、パターンは、タスクに依存するベースディレクトリ(<fileset>
の場合のdir属性)を基準とした相対パスとみなされます。そのベースディレクトリの下にあるファイルのみが考慮されます。そのため、../foo.javaのようなパターンは可能ですが、ベースディレクトリの親はファイルに対してスキャンされないため、適用しても何も一致しません。
*.java は .java、x.java、FooBar.javaに一致しますが、FooBar.xmlには一致しません(.javaで終わっていません)。
?.java は x.java、A.javaに一致しますが、.javaやxyz.javaには一致しません(両方とも.javaの前に1文字がありません)。
*
と?
の組み合わせが許可されます。
一致はディレクトリごとに実行されます。これは、まずパターンの最初のディレクトリが、一致するパスの最初のディレクトリと一致することを意味します。次に、2番目のディレクトリが一致し、以下同様です。たとえば、パターンが/?abc/*/*.javaで、パスが/xabc/foobar/test.javaの場合、最初の?abcはxabcと一致し、次に*はfoobarと一致し、最後に*.javaはtest.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タスクのリストです。
<checksum>
<copydir>
(*非推奨*)<delete>
<dependset>
<fixcrlf>
<javac>
<replace>
<rmic>
<xslt>
(別名<style>
)<tar>
<zip>
<ddcreator>
<ejbjar>
<ejbc>
<cab>
<native2ascii>
<netrexxc>
<renameextensions>
<depend>
<translate>
<image>
<jlink>
(*非推奨*)<jspc>
(*非推奨*)<wljspc>
<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タスクを使用して、デフォルトの除外のリストを変更できることに注意してください。