一些任务利用目录树来执行一些动作
一些任务利用目录树来执行一些动作。例如,javac这个任务就是一个基于目录的任务,它将一个目录中的.java文件编译为.class文件。因为一些这样的任务在目录树上做很多的工作,所以这些任务本身充当了隐含的文件集(FileSet)。下面这些标准的ant任务充当了隐含的文件集:
(列表来自 ant官网手册:https://ant.apache.org/manual/index.html)
在文件集(FileSet)上创建文件的一个子集的方式
基于目录的任务可以在目录树的子集上操作。
ant提供了两种方式在一个FileSet上创建文件的一个子集:
1)基于模式集来选择:只包含匹配include模式、但不匹配exclude模式的文件和目录。
2)基于选择器来选择:基于内嵌的选择器的规则来选择文件。下面是核心选择器:
列表来自ant官网手册:https://ant.apache.org/manual/index.html
基于目录的任务:声明包含、不包含规则的方式
- 基于目录的任务,可以用如下方式来声明包含、不包含规则:
1)用includes 和 excludes属性
2)内嵌<include> 和 <exclude>
元素
3)用includesfile 和 excludesfile属性指明引用的外部文件
4)用<includesfile> 和 <excludesfile>
内嵌元素指明引用的外部文件
如果引用了外部文件,外部文件的每一行作为一个模式,被添加到包含、不包含模式的列表中。
- 当包含、不包含模式都出现的时候,那么只有匹配至少一个包含模式、同时不匹配任何不包含模式的文件/目录才会被使用。
几个例子:
模式
“*”和“?”
- 模式看起来非常象DOS 和 UNIX下使用的模式。
“*”
匹配0个或者多个字符,“?”
匹配1个字符。 - 通常,模式作为相对目录来对待。是相对于任务(task)依赖的基目录。例如,如果在
<fileset>
中使用,那么是相对于dir属性指定的目录。只有在基目录下发现的文件才会被考虑。 “*”
和“?”
可以结合使用。
例如, …/Demo.java不会匹配任何文件,因为“..”
表示上层目录,而基目录的上层目录不会被扫描。
例如*.java 可以匹配 .java, A.java 和Demo.java,但不会匹配Demo.class。
?.java可以匹配A.java,B.java,但不会匹配Demo.java。
- 匹配是针对每个目录来进行的。这意味着:首先,模式中的第1个目录与路径中的第1个目录进行匹配,然后是第2个目录进行匹配,以此类推。
例如模式/?abc/*/*.java
,路径/xabc/foobar/Test.java
,首先,?abc
和xabc
是匹配的,然后*
和foobar
是匹配的,最后*.java
和Test.java
是匹配的。因为所有都匹配上了,就说这个模式和路径是匹配的。
"**"
匹配多个目录层级
"**"
能够匹配多个目录层级。这个可以用来匹配一个完整的目录树,或者目录树上任何地方的一个文件。为了实现这个功能,"**"
必须作为一个目录的名字使用。当"**"
在模式中作为一个目录的名字来使用的时候,它匹配0个或者多个目录。
举例:
/test/**
匹配/test/
目录下的任何目录和文件,例如 /test/A.java
, 或者 /test/foo/bar/abc.html
,但不匹配 /xyz.xml
- 作为一个简略方式,如果模式以
"/"
或者"\"
结尾,那么"**"
被会附加上去。
例如test/
被解释为test/**
默认排除
列表来自ant的手册:https://ant.apache.org/manual/index.html
从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