从0.3升级到0.4
注意,即使你能熟练的使用grunt,新的Getting start指南都是值得一读的。
Grunt现在被分割为三部分:grunt
, grunt-cli
和grunt-init
。
npm模块
grunt
应该安装到你本地的项目中。它包含运行任务,插件加载的代码和逻等等。npm模块
grunt-cli
应该被安装在全局环境中。它会把grunt
命令植入到你所有的路径中,因此你可以在任意位置执行grunt命令。对于它自身而言,它不会做任何事情; 它的工作就是在你已经安装的本地项目中加载和运行Grunt,无论是哪个版本的Grunt。想要了解更多关于它演变的信息,请阅读: npm 1.0:Global vc Local installation。init
任务已经被分解为其自身的npm模块:grunt-init
。它可应该使用npm install -g gruntp-init
在全局安装,然后就可以使用grunt-init
命令来执行。在未来几个月中,Yeoman将完完全取代grunt-init。查看grunt-init项目主页,里面有更多更详细的信息。
Yeoman的门槛比较高,目前Grunt并没有使用Yeoman完全替代grunt-init.
预装的任务和插件
所有的grunt-contrib-*
系列的插件都是Grunt0.4才有的。然而,极有可能第三方为Grunt0.3所编写的插件还继续在Grunt0.4中工作直到它们被更新。我们也在积极的与插件作者一起努力确保尽快更新它们。
一个致力于脱离grunt架构的Grunt即将发布,这样就可以保证插件不会受到未来更新的影响。
要求
Grunt现在需要0.8.0
及以上版本的Node.js支持。
Gruntfile
- “Gruntfile”已经从
grunt.js
改变为gruntfile.js
。 - 在你项目中名为
Gruntfile.coffee
的gruntfile以及*.coffe
任务文件中已经支持CoffeeScript了(会自动解析为JS)。
可以查看”Gruntfile”部分的入门指南以获取更多详细信息。
核心任务就是现在的Grunt插件
Grunt0.3中所包含的8个核心任务现在都变成了独立的Grunt插件。 其中每个插件都变成了独立的npm模块,而且必须被作为一个插件安装使用。对应的信息在Grunt入门指南的”加载Grunt插件和任务”一节。
- concat → grunt-contrib-concat插件
- init → 独立的grunt-init功能
- lint → grunt-contrib-jshint插件
- min → grunt-contrib-uglify插件
- qunit → grunt-contrib-qunit插件
- server → grunt-contrib-connect插件
- test → grunt-contrib-nodeunit插件
- watch → grunt-contrib-watch插件
有些任务名称和选项都已经发生了变化。 可以通过上面的链接查看每个插件文档中的最新配置信息。
配置
Grunt0.4的任务配置格式已经被标准化并大大提高了质量。可以查看配置任务指南,也可以查看单独的插件文档了解更多详细信息。
- 文件匹配(通配符)模式现在可以排除文件匹配来反选匹配项,
- 任务现在支持一个标准的
options
对象, - 任务现在支持一个标准的
files
对象;
Gruntfile内作为配置数据指定的<% %>
风格的字符串模板会自动解析,查看grunt.template文档可以了解更多信息。
移除了指令,但是它们的功能仍然保留着。可以使用下面的替代方式:
'<config:prop.subprop>'
→'<%= prop.subprop %>'
'<json:file.json>'
→grunt.file.readJSON('file.json')
'<file_template:file.js>'
→grunt.template.process(grunt.file.read('file.js'))
现在使用<banner>
或者<banner:prop.subprop>
替代在文件列表中指定banner信息,grunt-contrib-concat和grunt-contrib-uglify插件都有一个banner
选项.
现在使用<file_strip_banner:file.js>
替代从文件中单独剥离banners,grunt-contrib-concat和grunt-contrib-uglify插件都有一个选项用于剥离/保留banners选项。
别名任务变化
当指定一个别名任务时,现在必须将运行的任务列表指定为一个数组:
//v0.3.x(老格式)
grunt.registerTask('default', 'jshint nodeunit concat');
//v0.4.x(新格式)
grunt.registerTask('default', ['jshint','nodeunit','concat']);
任务参数现在可以包含空格
上述别名任务的变化(任务列表必须指定为一个数组)使得参数包含空格变得可能。当在命令行中指定它们时,只需要确保传递给任务的参数是在引号中包含空格,这样它们才可以正确的解析。
正如你所了解的,在JS对象的属性中,字符串形式的属性可以包含空格。
grunt my-task:argument-without-spaces "other-task:argument with spaces"
字符编码
file.defaultEncoding方法被加入到默认的字符编码中,所有的grunt.file
的方法都已经更新以支持指定编码。
帮助
Grunt的帮助系统所遵循的noderequire
机制已经被移除了。对于在简单的例子和Grunt插件之间如何共享功能,请查看grunt-lib-legacyhelpers。插件的作者也在积极的更新他们的插件。
API
Grunt API从0.3到0.4有了实质性的变化.
- grunt
- 移除了
grunt.registerHelper
和grunt.renameHelper
方法.
- 移除了
- grunt.config
- 改变grunt.get方法为自动以递归的方式解析
<% %>
形式的模板。 - 添加了grunt.getRaw方法用于检索原始(未加工的)配置数据。
- 改变grunt.process方法为现在的值加工,如果它已经从配置中检索到,就会递归的解析模板。这个方法要在
grunt.get
内部调用,但是不能在config.getRaw
内部调用。
- 改变grunt.get方法为自动以递归的方式解析
- grunt.file
- 任务不再从
~/.grunt/tasks/
目录中自动加载(请在本地项目中安装)。 - 给所有的
grunt.file
方法添加了file.defaultEncoding方法用于处理默认编码。 - 添加了file.delete方法
- 添加了顾名思义的 file.exists,file.isDir,file.isFile,file.isLink,file.isPathCwd,file.isPathInCwd, file.doesPathContain,file.arePathsEquivalent等测试方法。
- 添加了file.match和file.isMatch方法便于匹配文件时使用通配符模式。
- 添加了file.expandMapping方法用于生成1对1的src-dest文件映射。
- 添加了file.readYAML方法。
- 改变file.findup为使用findup-sync模块。
- 改变file.glob为使用glob模块。
- 添加了file.miniatch来暴露minimatch模块。
- 移除了
file.userDir
方法(移到grunt-init中了) - 移除了
file.clearRequireCache
方法。 - 移除了
file.expandFiles
和file.expandDirs
方法,现在使用filter
选项的file.expand
替代。 - 移除了
file.expandFileURLs
方法。不应该指定URLs,应该指定文件(例如:qunit任务现在支持一个urls
选项)。
- 任务不再从
- grunt.task
- 使用task.registerTask和task.registerMultiTask获取一个
this.options
方法来注册任务。 - 添加了task.normalizeMultiTaskFiles方法便于标准化多任务
files
对象到this.file
属性。 - 移除了
task.registerHelper
和task.renameHelper
方法 - 移除了
task.searchDirs
属性 - 移除了
task.expand
task.expandDirs
task.expandFiles`task.getFile
task.readDefaults`方法(移到grunt-init中了)
- 使用task.registerTask和task.registerMultiTask获取一个
- grunt.package表示存储在grunt的
package.json
中的元数据。 - grunt.version是Grunt的当前版本,是一个字符串。
- grunt.template
- 添加了template.addDelimiters方法用于添加新模板分隔符。
- 添加了template.setDelimiters方法用于选取模板分隔符。
- 移除了
init
和user
模板分隔符,如果有需要你可以使用template.addDelimiters
再次添加它们(grunt-init使用这个启用{% %}
模板分隔符)。
- grunt.util替换了现在已经移除的
grunt.utils
- 改变
util._
为使用Lo-Dash。 - 添加了util.callbackify方法,确保与回调函数中传递更一致的参数。
- 改变
任务/插件作者
插件作者,请在你仓库中的README文件中清晰的表明你的Grunt插件的数字版本以避免与Grunt 0.3的兼容性问题。
任务
- 多任务
- 多个
src-dest
文件映射形式现在可以给每个目标指定一个files
对象(这是可选的)。
- 多个
- this.files / grunt.task.current.files
this.files
属性是一个遍历你的多任务得到一个src-dest
文件映射对象数组。它一直都是一个数组, 即使通常只时指定一个单一的文件,它也会遍历返回一个数组。- 每个
src-dest
文件映射对象都有一个src
和dest
属性(对于其他情况, 取决于用户是否指定)。src
属性可能早已从用户以任何方式指定的glob模式中解析了。
- this.filesSrc / grunt.task.current.filesSrc
this.filesSrc
属性是一个与所有指定的src
属性所匹配归并的,uniqued文件数组。这对只读任务非常有用.
- this.options / grunt.task.current.options
this.options
可以用在任务中用于标准化options。在任务内部,你可能会指定默认的options就像:var options = this.options({option: 'defaultvalue', ...});
。
插件
Grunt 0.4中创建了一个兼容Grunt 0.4插件的gruntplugin
模板,并且在独立的grunt-init中是有效的。
故障排除
- 如果你之前已经安装了开发版本的Grunt 0.4或者grunt-contrib插件,务必首先使用
npm cache clean
清空你的npm缓存以确保提取最终版本的Grunt和grunt-contrib插件。