基于目录的ant任务

一些任务利用目录树来执行一些动作

一些任务利用目录树来执行一些动作。例如,javac这个任务就是一个基于目录的任务,它将一个目录中的.java文件编译为.class文件。因为一些这样的任务在目录树上做很多的工作,所以这些任务本身充当了隐含的文件集(FileSet)。下面这些标准的ant任务充当了隐含的文件集:
(列表来自 ant官网手册:https://ant.apache.org/manual/index.html)
基于目录的ant任务_第1张图片

在文件集(FileSet)上创建文件的一个子集的方式

基于目录的任务可以在目录树的子集上操作。
ant提供了两种方式在一个FileSet上创建文件的一个子集:
1)基于模式集来选择:只包含匹配include模式、但不匹配exclude模式的文件和目录。
2)基于选择器来选择:基于内嵌的选择器的规则来选择文件。下面是核心选择器:
列表来自ant官网手册:https://ant.apache.org/manual/index.html
基于目录的ant任务_第2张图片

基于目录的任务:声明包含、不包含规则的方式

  • 基于目录的任务,可以用如下方式来声明包含、不包含规则:

1)用includes 和 excludes属性
2)内嵌元素
3)用includesfile 和 excludesfile属性指明引用的外部文件
4)用内嵌元素指明引用的外部文件
如果引用了外部文件,外部文件的每一行作为一个模式,被添加到包含、不包含模式的列表中。

  • 当包含、不包含模式都出现的时候,那么只有匹配至少一个包含模式、同时不匹配任何不包含模式的文件/目录才会被使用。

几个例子:
基于目录的ant任务_第3张图片
基于目录的ant任务_第4张图片
基于目录的ant任务_第5张图片
基于目录的ant任务_第6张图片

模式

“*”和“?”

  • 模式看起来非常象DOS 和 UNIX下使用的模式。“*”匹配0个或者多个字符,“?”匹配1个字符。
  • 通常,模式作为相对目录来对待。是相对于任务(task)依赖的基目录。例如,如果在中使用,那么是相对于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,首先,?abcxabc是匹配的,然后*foobar是匹配的,最后*.javaTest.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

你可能感兴趣的:(ant)