这是ant理论部分的最后一章,也是非常重要的一章,明河将介绍ant中常用的几种dataType的用法。
dataType可以理解为复杂数据集合,比如特定规则的文件列表集合。
ant的所有dataType标签
- fileset:定义一个文件集合列表,这些文件必须确实存在
- filelist:定义一个文件集合列表,这些文件无需确实存在
- path:以某种在不同操作系统间可移植的方式指定路径
- patternset:将一组模式分组在一起
- argument:对于由一个ant构建文件调用的程序,向其传递命令行参数(标签名是arg)
- filterlist:将一组过滤器分组在一起
- mapper:定义一组输入文件和一组输出文件间的复杂关系
- environment:于由一个ant构建文件调用的程序,向其传递环境变量
必须掌握的是:fileset、filelist、path、argument、patternset。
fileset
fileset和filelist(下面会讲到),功能上非常相近,都是用于获取一组文件列表,二者的不同之处在于fileset内的文件必须存在,filelist则没这要求;fileset的属性也比filelist更为的丰富,所以功能上更为的强大,一般使用fileset来获取文件。
属性 | 说明 |
dir | fileset的基目录 |
dir | fileset的基目录 |
casesensitive | 如果为false,那么匹配文件名时不区分大小写,默认为true |
defaultexcludes | 是否使用默认的排除模式,默认为true。默认的排除模式会把一些版本控制的文件夹或文件排除 |
excludes | 排除指定的文件列表(用逗号隔开) |
excludesfile | 排除指定的文件 |
includes | 需要包含的文件列表(用逗号隔开) |
includesfile | 包含指定的文件 |
任务1:合并uploader目录下的所有文件
<dirname property="current.dir" file="${ant.file.uploader}"/>
<property name="uploader.dir" location="${current.dir}/uploader" />
<target name="build-all">
<echo>dir:${current.dir}</echo>
<concat destfile="uploader.js" encoding="utf8" outputencoding="utf8">
<fileset dir="${uploader.dir}" includes="**/*.js" />
</concat>
</target>
concat(合并)这个任务标签,明河之前有讲过了,与之前写的demo不同的是,concat内增加了fileset。由于我们的需求是合并uploader目录下的所有js,所以uploader下文件不少,明显不可能单独一个个写path,这时候就需要用到fileset,获取文件列表集合。
fileset会获取${uploader.dir}(该属性引用指向uploader目录)下所有的js,通过includes=”**/*.js”包含所有js。
也许你会对**/*感到疑惑,明河下面做个说明。
包含和排除模式语法:
- *:匹配0或多个字符,比如*.js匹配minghe.js、taobao.js但不匹配minghe.css
- ?:匹配1个字符,比如mingh?.js,匹配minghe.js、minghg.js,但不匹配minghe36.js
- **:匹配0或多个目录,比如/minghe/**,匹配/minghe/下的任意目录,**/*.js匹配任意目录下的所有js文件
使用patternset标签
除了使用属性外,fileset还支持0到n个嵌套patternset元素,比如<exclude></exclude>和<include></include>等,关于patternset会在下面讲解到,这里先贴出修改后的demo。
<target name="build-all2">
<echo>build-all2</echo>
<concat destfile="uploader2.js" encoding="utf8" outputencoding="utf8">
<fileset dir="${uploader.dir}" >
<include name="**/*.js" />
<exclude name="demo/*.js" />
</fileset>
</concat>
</target>
这里的demo代码,与上一个demo相比,增加了一个排除文件模式,demo目录下的js文件,显然我们不需要,可以通过
标签予以排除
filelist
filelist通常与dependset任务一同使用,dependset任务用于将一个或多个源文件和1个或多个目标文件相比较,如果源文件存在更新或者删除,那么所有目标文件将将被删除。dependset用于确保文件的依赖性。
filelist的属性
属性 | 说明 |
dir | fileset的基目录 |
files | 用逗号隔开的文件列表 |
refid | 对某处定义的一个的引用,这对于希望多次复用一个定义的文件列表,非常有用。 |
filelist的使用率不高,明河这里偷个懒,不再制作个独立的demo。
path
path在java打包编译中常用到,可以以属性(多个路径用冒号或分号隔开)或嵌套元素的方式。
path用于转换路径为当前用户操作系统可兼容的路径。(path dataType并不只有
元素,还有等形式标签)。
当path以标签的形式出现时,拥有以下属性:
属性 | 说明 |
location | 表示一个文件或目录 |
path | 一个文件和路径名列表,以冒号或分号隔开 |
refid | 定义path的一个引用 |
patternset
patternset与fileset是紧密结合的,常作为fileset的嵌套元素出现,比如和exclude标签。
<target name="build-all3">
<echo>build-all3</echo>
<concat destfile="uploader2.js" encoding="utf8" outputencoding="utf8">
<fileset dir="${uploader.dir}" >
<include name="**/*.js" if="test" />
<exclude name="demo/*.js" unless="demo" />
</fileset>
</concat>
</target>
留意代码中的if和unless属性,if=”test”可以理解为如果存在test属性,就读取文件,unless=”demo”可以理解为只有未设置demo属性时才读取文件。
argument
arg标签在apply、exec、java标签内嵌套,用于传递命名行参数。
先贴出日后会说明的demo代码:
<apply executable="java" verbose="true" dest="${combines.dir}" failοnerrοr="true" parallel="false">
<fileset dir="${combines.dir}" includes="**/*.js"/>
<arg line="-jar"/>
<arg path="${current.dir}/closure-compiler/compiler.jar"/>
<arg line="--charset gbk"/>
<arg value="--warning_level"/>
<arg value="QUIET"/>
<arg value="--js"/>
<srcfile/>
<arg value="--js_output_file"/>
<targetfile/>
<mapper type="regexp" from="^(.*)\.source\.js$" to="\1-min.js"/>
</apply>
上述代码是调用google压缩器压缩js源文件,apply嵌套多个arg标签,比如下面的代码:
<arg path="${current.dir}/closure-compiler/compiler.jar"></arg>
<arg line="--charset gbk"></arg>
<arg value="--warning_level"></arg>
<arg value="QUIET"></arg>
<arg value="--js"></arg>
执行时会合并成一个命名行,类似–charset gbk –warning_level QUIET –js。