有些工作會針對它們執行的動作使用目錄樹。例如,javac 工作會將包含 .java 檔案的目錄樹編譯成 .class 檔案,這是其中一項目錄式工作。由於其中一些工作會對目錄樹執行大量工作,因此工作本身可以作為隱含的 FileSet。
無論檔案集是隱含的與否,在目錄樹的子集上工作通常會非常有用。本節說明在使用其中一項目錄式工作時,如何選取該目錄樹的子集。
Apache Ant 提供兩種方法來建立檔案集中檔案的子集,這兩種方法可以同時使用
我們說過,目錄式工作有時可以作為隱含的 <fileset>
,但除此之外,FileSet 會作為隱含的 <patternset>
。
隱含 PatternSet 的包含和排除元素可以在目錄式工作 (或明確的檔案集) 內透過下列方式指定
<include>
和 <exclude>
。<includesfile>
和 <excludesfile>
指定的外接檔案。
在處理外接檔案時,檔案的每一行都會視為模式,並新增到包含或排除模式的清單中。
在同時使用包含和排除時,僅會使用符合至少一個包含模式且不符合任何排除模式的檔案/目錄。如果未提供包含模式,則假設所有檔案都符合包含模式 (可能排除預設排除項)。
如前所述,模式用於包含和排除檔案。這些模式看起來很像 DOS 和 UNIX 中使用的模式
*
匹配零個或多個字元,?
匹配一個字元。
一般而言,模式被視為相對路徑,相對於任務依賴的基礎目錄(在 <fileset>
的情況下為 dir 屬性)。僅考慮在該基礎目錄下方找到的檔案。因此,雖然 ../foo.java 這樣的模式是可能的,但套用時不會匹配任何內容,因為從未掃描基礎目錄的父目錄以尋找檔案。
*.java 匹配 .java、x.java 和 FooBar.java,但不匹配 FooBar.xml(不以 .java 結尾)。
?.java 匹配 x.java、A.java,但不匹配 .java 或 xyz.java(在 .java 之前都沒有單一字元)。
允許 *
和 ?
的組合。
比對是按目錄進行的。這表示模式中的第一個目錄會先與要比對路徑中的第一個目錄進行比對。然後比對第二個目錄,依此類推。例如,當我們有模式 /?abc/*/*.java 和路徑 /xabc/foobar/test.java 時,第一個 ?abc 會與 xabc 比對,然後 * 會與 foobar 比對,最後 *.java 會與 test.java 比對。它們都比對成功,因此路徑符合模式。
為了讓事情更具彈性,我們新增了一個額外功能,讓它可以比對多個目錄層級。這可以用於比對完整的目錄樹,或目錄樹中的任何檔案。為此,必須將 **
用作目錄的名稱。當 ** 用作模式中目錄的名稱時,它會匹配零個或多個目錄。例如:/test/** 匹配 /test/ 下的所有檔案/目錄,例如 /test/x.java 或 /test/foo/bar/xyz.html,但不匹配 /xyz.xml。
有一個「簡寫」:如果模式以 /
或 \
結尾,則會附加 **
。例如,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 作為檔名。 |
當這些模式用於包含和排除時,您可以強而有力地選擇您想要的檔案。
無論是目錄式工作中的隱含或明確 <fileset>
,都充當 <and>
選擇器容器。這可以用於建立工作任務檔案的任意複雜選擇準則。有關更多資訊,請參閱 選擇器 文件。
ant 中的許多標準工作任務會採用一個或多個遵循此處規則的檔案組。此清單是其中一部分,是可作為隱含檔案組的標準 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 工作任務修改預設排除清單。