首先要装上 Grunt 命令行以及 Grunt 本身:
sudo npm install -g grunt-cli
npm install –save-dev grunt
Grunt 要靠插件完成任务,Grunt 插件列表(http://gruntjs.com/plugins)中列出了所有可用 插件。我们需要 Mocha、JSHint 和 LinkChecker 的插件。在写本书时,还没有 LinkChecker 的插件,所以我们只能用执行 shell 命令的通用插件。接下来我们先把必需的插件装上:
npm install –save-dev grunt-cafe-mocha
npm install –save-dev grunt-contrib-jshint
npm install –save-dev grunt-exec
现在所有插件都装好了,在项目目录下创建一个 Gruntfile.js 文件:
module.exports = function(grunt) {
// 加载插件
['grunt-cafe-mocha',
'grunt-contrib-jshint',
'grunt-exec'
].forEach(function(task){
grunt.loadNpmTasks(task);
});
// 配置插件
grunt.initConfig({
cafemocha: {
all: {
src:'qa/tests-*.js',
options: { ui: 'tdd' }
}
},
jshint: {
app: ['meadowlark.js',
'public/js/**/*.js',
'lib/**/*.js'],
qa:['Gruntfile.js','public/qa/**/*.js', 'qa/**/*.js']
},
exec: {
linkchecker:{ cmd: 'linkchecker http://localhost:3000}
},
});
// 注册任务
grunt.registerTask('default', ['cafemocha','jshint','exec']); };
在“加载插件”部分,我们指定了要用哪些插件,跟我们通过 npm 安装的插件一样。(一旦你开始依赖 Grunt,相信我,你会添加更 多插件的),所以我选择把它们全部放到数组中,并用 forEach 循环遍历。
在“配置插件”部分,我们必须做些工作让每个插件都能正常工作。对于 cafemocha 插件 (由它运行逻辑和跨页测试),我们必须告诉它测试在哪里。我们把所有测试都放在子目录 qa 下面,并在文件名中加上前缀 tests-。注意,我们必须指定 TDD 界面。如果是 TDD 和 BDD 混合的界面,则必须想办法把它们分开。比如,你可以用两个前缀 tests-tdd- 和 testsbdd-。
对于 JSHint,我们必须指定要对哪些 JavaScript 文件去毛。这里一定要当心!依赖项经 常不一定能通过 JSHint,或者它们用的是不同的 JSHint 设置,并且你会被 JSHint 错误淹 没,而其中很多代码都不是你写的。具体来说,你要确保别把 node_modules 目录以及任何 vendors 目录包含在内。目前 grunt-contrib-jshint 还不能排除文件,只能包含它们。所以 我们必须指定所有想要包含在内的文件。我一般会把想要包含的文件分成两个列表:真正 构成应用程序或网站的 JavaScript,以及 QA JavaScript。它们都要去毛,但这样分开更容 易管理一些。注意通配符 /**/ 的含义是“子目录中的所有文件”。尽管现在还没有 public/ js 目录,但我们会有的。隐含着排除的是 node_modules 和 public/vendor 目录。
最后,我们配置了 grunt-exec 插件,让它运行 LinkChecker。注意,我们把端口 3000 硬编 码在这个插件的配置里了。这最好能参数化。
最后我们“注册”了这些任务:把单个的插件放到一个命名分组中。一个特定名称的任务 default,在你只是输入 grunt 后,就会默认运行。
现在你只需确保服务器在(后台或另一个窗口中)运行着,然后运行 Grunt:
grunt
所有测试都会运行(除了页面测试),所有代码都会去毛,所有链接都会被检查!如果某 个组件失效,Grunt 会给出错误消息并终止,否则它会报告“完成,没有错误”。没有什么 比看到这条消息更让人满意的了,所以养成提交前运行 Grunt 的习惯吧!