一、概述
Selectors是一种机制,可以提供除了include和exclude标签以外的标准选择文件来构成fileset。selector是文件集的一个元素,还可以通过selector标签在target外定义,然后通过引用来使用它。不同的选择器有不同的属性,一些选择器可以包含其他的选择器,这些选择器被称为选择器容器。还有一种允许用户定义扩展的选择器,叫定制选择器。Ant内置的选择器叫核心选择器。
二、核心选择器
- contains:选择包含特定文本字符串的文件,文件集中的contains标签限制了其中的文件包含text属性指定字符串。contains还可以作为资源集合restrict的资源选择器,具有以下属性:
text:指定每个文件必须包含的文本。
casesensitive:查找text属性字符串时是否区分大小写,默认为true。
ignorewhitespace:在查找text属性字符串之前是否删除空格,默认为false。 - date:选择在特定日期或时间之前或之后的文件,文件集中的date标签限制include标签指定文件,最后修改日期不满足选择器指定日期的限制的文件不会被选择,具有以下属性:
datetime:指定用于比较的日期和时间。格式默认为MM/DD/YYYY HH:MM AM(或PM),如果设置了pattern属性,则与pattern属性一致。
millis:指定时间的毫秒数。比用datetime属性要简单。
when:如何根据文件最后修改时间与指定时间选择文件,可选值有before(最后修改时间在指定时间之前)、after(最后修改时间在指定时间之后)、equal(最后修改时间在指定时间相同)。默认为equal。
granularity:由于不是每个文件系统都支持修改时间精确到毫秒级,所以在比较修改时间的毫秒数时允许存在一定的误差,默认是0毫秒,DOS系统上是2秒。
pattern:ant1.6.2起,datetime属性使用的SimpleDateFormat兼容模式。
checkdirs:是否检查目录的日期,默认为false。 - depend:选择最后修改时间比另一个位置下同名文件的最后修改时间更晚的文件,depend支持嵌套mapper元素来定义用于比较的文件的位置,如果没有指定mapper元素,默认使用identity类型的mapper,depend区分大小写,具有以下属性:
targetdir:查找用于比较的文件的基本目录,如果存在mapper的话,精确的位置取决于此属性与mapper元素的组合。
granularity:由于不是每个文件系统都支持修改时间精确到毫秒级,所以在比较修改时间的毫秒数时允许存在一定的误差,默认是0毫秒,DOS系统上是2秒。 - depth:选择基本目录下指定目录深度的文件,具有以下属性:
min:要选择的文件基于基本目录的最小目录层级。
max:要选择的文件基于基本目录的最大目录层级。 - different:选择认为与其他位置下同名文件不同的文件,决定文件不同的规则为:
1.应用选择器的资源集合中存在的文件在targetdir中不存在,则选择此文件。
2.只存在于targetdir(或者应用mapper后)中的文件被忽略。
3.文件长度不同,则认为不同。
4.如果ignoreFileTimes设置为false,不同的文件时间戳认为是不同的文件。
5.如果ignoreContents设置为false,会对两个文件按字节进行比较。
different支持嵌套mapper元素来定义用于比较的文件的位置,如果没有指定mapper元素,默认使用identity类型的mapper。different具有以下属性:
targetdir:查找用于比较的文件的基本目录,如果存在mapper的话,精确的位置取决于此属性与mapper元素的组合。
ignoreFileTimes:在比较时是否忽略文件时间,默认为true。
ignoreContents:ant1.6.3起,是否忽略内容(即按字节比较),默认为false。
granularity:由于不是每个文件系统都支持修改时间精确到毫秒级,所以在比较修改时间的毫秒数时允许存在一定的误差,默认是0毫秒,DOS系统上是2秒。
- filename:选择名字与指定模式匹配的文件,与patternset的include和exclude元素等效。但是使用选择器代替,可以使用任何选择器容器将其与其他选择器组合在一起,filename区分大小写,有以下属性:
name:选择的文件名字,名字可以使用ant标准的通配符。
regex:选择的文件要匹配的正则表达式。
caseseneitive:是否区分大小写,默认为true。
negate:是否反转filename选择的结果,以此可以模拟exclude标签,默认为false。 - present:选择其他位置下存在或不存在的文件。present支持嵌套mapper元素来定义用于比较的文件的位置,如果没有指定mapper元素,默认使用identity类型的mapper。present区分大小写,具有以下属性:
targetdir:查找用于比较的文件的基本目录,如果存在mapper的话,精确的位置取决于此属性与mapper元素的组合。
present:需要文件只在源目录树中存在还是需要在源目录树和目标目录树中都存在。可选值为:srconly、both,默认为both。 - containsregexp:选择与正则表达式匹配的文件,containsregexp限制文件集中文件的内容包含与expression属性定义的正则表达式匹配。containsregexp还可以作为资源选择器restrict的资源选择器,具有以下属性:
expression:文件需要匹配的正则表达式。
caseseneitive:ant1.8.2起,是否区分大小写,默认为true。
multiline:ant1.8.2起,是否指定多行匹配,默认为false。
singleline:ant1.8.2起,是否使用单行模式,此模式会将“.”与行结束符匹配,与java正则中的DOTALL模式对应。默认为false。 - size:选择比指定字节数更大或更小的文件,文件集中不满足选择器指定大小的文件不会被选中,具有以下属性:
value:用于比较的文件的大小,必须是整数。
units:value属性的单位,如果使用K、M、G、T,使用1000进行换算。如果使用Ki、Mi、Gi、Ti,使用1024进行换算。默认没有单位,value就是准确的字节大小。
when:选择大于、小于或等于value大小的文件,可选值为less(小于指定大小)、more(大于指定大小)、equal(等于指定大小),默认为equal。 - type:选择常规文件或者目录,具有以下属性:
type:文件类型,可选值为:file、dir。 - modified:选择配置的算法的返回值与缓存中的值不同的文件。这个选择器是高度可配置的,选择的顺序是:
1.获取文件的绝对路径。
2.以绝对路径为键,从配置的缓存中获取缓存的值。
3.从配置的算法中获取新值。
4.用配置的比较器比较这两个值。
5.如果需要更新缓存中的值。
6.根据比较结果进行选择。
比较、hash值计算和存储都是通过实现特殊接口实现的,因此可以提供额外的参数。modified还可以作为资源选择器restrict的资源选择器,这种情况下,会将简单的文件资源映射到文件并进行计算,如果是其他类型的资源,选择器会尝试将内容拷贝到本地文件进行计算。modified具有以下属性:
algorithm:使用的算法,可选值为:hashvalue(HashvalueAlgorithm )、digest(DigestAlgorithm)、DigestAlgorithm(ChecksumAlgorithm),默认值为digest。
cache:使用的缓存类型, 可选值为:propertyfile(PropertyfileCache),默认值为propertyfile。
comparator:使用的比较器类型,可选值为:equal(EqualComparator)、rule(java.text.RuleBasedCollator),默认值为equal。
algorithmclass:自定义算法实现的类名,优先级低于algorithm。
cacheclass:自定义缓存实现的类名,优先级低于cache。
comparatorclass:自定义比较器实现的类名,优先级低于comparator。
update:如果两个值不同是否更新缓存,默认为true,
seldirs:是否选择目录,默认为true。
selres:是否选择没有InputStream的资源,只有在被当作资源选择器使用时才有效,默认为true。
delayupdate:是否延迟缓存的存储到下一个构建事件的完成(完成task、完成target或者完成build),此属性依赖于update属性,如果设置为false,每次改变都会发生缓存的存储。默认为true,这样可以提高性能。这些属性还可以通过嵌套param元素来设置,还可以通过以下命名规则设置其他属性的值:
algorithm:与algorithm属性一致。
cache:与cache属性一致。
comparator:与comparator属性一致。
algorithmclass:与algorithmclass属性一致。
cacheclass:与cacheclass属性一致。
comparatorclass:与comparatorclass属性一致。
update:与update属性一致。
seldirs:与seldirs属性一致。
algorithm.*:通过setXX方法将值传入algorithm。
cache.*:通过setXX方法将值传入cache。
comparator.*:通过setXX方法将值传入comparator。
algorithm选项:
hashvalue将文件内容读到java.lang.String中,然后调用hashValue方法计算hash值。没有额外配置。
digest使用java.security.MessageDigest,支持两个属性:1)algorithm.algorithm:digest算法的名字,例如MD5或SHA,默认为MD5;2)algorithm.provider:digest提供者,默认为null。
checksum使用java.util.zip.Checksum,支持一个属性:algorithm.algorithm:算法的名字,例如CRC或ADLER,默认为CRC。
cache选项:
propertyfile使用java.util.Properties,支持一个属性:cache.cachefile:属性文件名,默认为cache.properties。
comparaator选项:
equal简单的对象比较,没有额外配置。
rule使用java.text.RuleBasedCollator进行对象比较,没有额外配置。 - signedselector:ant1.7起,选择已签名文件或者有指定签名名称的文件,具有以下属性:
name:要检查的签名名称。 - scriptselector:ant1.7引入,使用支持BSF或者JSR 223的脚本语言创建自己的选择器,包含的属性与script任务相同。嵌入脚本每次都会执行,self绑定了当前的selector,它有一个selected属性,必须通过setSelected(boolean)来选择文件。每个脚本都包含以下属性以及传统的script相同的project、properties和targets属性:
self:选择器实例。
filename:选择的文件名。
file:选择的文件。
basedir:文件集基本目录。
选择器实例self包含以下属性,其中只有selected是可写的,其他属性都只能通过对应的getter方法获取:
selected:文件选择标志。
filename:选择的文件名。
file:选择的文件。
basedir:文件集基本目录。
- readable:选择可读的文件。ant调用 java.io.File的canRead方法,如果文件不可读但是JVM不能检测到这个状态,那么选择器仍然会选择这个文件。
- writable:选择可写的文件。ant调用 java.io.File的canWrite方法,如果文件不可写但是JVM不能检测到这个状态,那么选择器仍然会选择这个文件。
三、简单示例
<fileset dir="../classfileset" includes="*.xml">
<contains text="file" casesensitive="no" ignorewhitespace="yes"/>
</fileset>
<fileset dir="." includes="*.xml">
<date datetime="01/01/2018 12:00 AM" when="after"/>
</fileset>
<fileset dir="../classfileset" includes="*.xml">
<depend targetdir=".">
<mapper type="identity"/>
</depend>
</fileset>
<fileset dir="../../task" >
<depth max="1"/>
</fileset>
<fileset dir="../../task" >
<filename name="**/*t.xml"/>
</fileset>
<fileset dir="../classfileset" includes="*.xml">
<present targetdir="." present="srconly"/>
</fileset>
<fileset dir="../classfileset" includes="*.xml">
<containsregexp expression="(.*)a\.xml(.*)content"/>
</fileset>
<fileset dir="../classfileset" includes="*.xml">
<size value="1" units="k" when="less"/>
</fileset>
<fileset dir="../classfileset" includes="*.xml">
<type type="file"/>
</fileset>
<fileset dir="../classfileset">
<modified update="true" seldirs="true">
<param name="cache.cachefile" value="mycache.properties"/>
</modified>
</fileset>
<fileset dir="../../task/zip" includes="*.zip">
<signedselector/>
</fileset>
<fileset dir="../classfileset">
<writable/>
</fileset>
<fileset dir="../../task/">
<scriptselector language="javascript">
self.setSelected((filename.indexOf('import.xml'))!=-1);
</scriptselector>
</fileset>
<fileset dir="../classfileset">
<readable/>
</fileset>
<fileset dir="../classfileset">
<writable/>
</fileset>