1. 查找文件
使用 fileset 元素包含和排除文件或目录,可以包含 Ant 通配符。例如:
<fileset dir="./src" includes="**/*.js"/>
<fileset dir="./src" includes="**/*.js" excludes="**/*-test.js"/>
filelist 元素需要明确指定要包含的文件。例如:
<filelist dir="./src" files="core/core.js"/>
2. 任务
JSHint 是用 JavaScript 编写,需要使用 Rhino 命令行 JavaScript 引擎执行它,从 http://www.mozilla.org/rhino 下载 Rhino,并把 js.jar 文件放在依赖文件夹里(lib.dir)。
直接在命令行运行 JSHint:java -jar js.jar jshint-rhino.js [list of files] [options]
例如:
java -jar js.jar jshint.js curly=true,noempty=true core/core.js
注意:我自己写例子执行上面的命令总是会报异常,后来在 JSHint 网站上找到有人报了这个 ISSUE (https://github.com/jshint/jshint/issues/1333),并提供了一个修改后的 jshint.js(http://download-ln.jetbrains.com/idea/jshint/jshint-2.3.0.js ),这样我才把上面的命令跑起来。另外 ISSUE #1422(https://github.com/jshint/jshint/issues/1422)指出从 2.3.0 开始出现这个问题。我重新下载了 2.2.0 版后,果然问题没有了。
说明:参考相关文档后,发现像 "curly=true……“这样的选项是放在后面的,书中的例子都写在前面了。
直接执行命令行太原始了,要利用 Ant 进行构建,可以使用 <java> 任务代替上面的命令行。
说明:此书作者使用的 <apply> 任务,该任务在最新版的 Ant 中已经废弃,因此我这里的例子使用的是 <java> 任务。
示例:
<target name="validate">
<java jar="js.jar" fork="true">
<arg path="jshint.js"/>
<arg path="core/core.js"/>
<arg line="curly=true,forin=true,latedef=true,noempty=true,undef=true"/>
</java>
</target>
一次处理多个文件:
<target name="validate">
<fileset id="srcfileset" dir="${src.dir}" includes="**/*.js"/>
<pathconvert property="srcfiles" pathsep=" " refid="srcfileset"/>
<java jar="js.jar" fork="true">
<arg path="jshint.js"/>
<arg path="${srcfiles}"/>
<arg line="curly=true,forin=true,latedef=true,noempty=true,undef=true"/>
</java>
</target>
注:<java> 任务不支持 fileset ,参考了 http://ant.1045680.n5.nabble.com/List-of-file-names-as-arguments-to-a-java-task-td1341160.html 后发现了上面的解决方法。
3. 增强的目标操作
要想在代码验证失败时阻止任务继续往下执行,可以给 <java> 任务设置 failonerror = "true" 属性。
4. 其他方面的改进
抽离可变的部分:
js.jar 的位置
jshint.js 的位置
命令行参数
把它们定义到属性或者属性文件中再导入是更好的选择。下面是一个属性文件的例子:
src.dir = ./src
lib.dir = ./lib
rhino = ${lib.dir}/js.jar
jshint = ${lib.dir}/jshint.js
jshint.options = curly=true,forin=true,latedef=true,\
noempty=true,undef=true,rhino=false
这样就可以在目标中引用这些属性了。例如:
<target name="validate">
...
<java jar="${rhino}" fork="true" failonerror="true">
<arg path="${jshint}"/>
<arg line="${srcfiles}"/>
<arg path="${jshint.options}"/>
</java>
</target>
5. Buildr 任务
导入 Buildr.xml 文件后,通过 <fileset> 元素即可使用 <jshint> 任务。
<target name="validate">
<jshint>
<fileset dir="${src.dir}" includes="**/*.js"/>
</jshint>
</target>
也可以使用 options 属性来更改默认选项。
<target name="validate">
<jshint options="${jshint.options}">
<fileset dir="${src.dir}" includes="**/*.js"/>
</jshint>
</target>
说明:刚刚去 Buildr 官网看了下,2 年没有更新了,估计是没什么人气。