从0.3升级到0.4

注意,即使你能熟练的使用grunt,新的Getting start指南都是值得一读的。

Grunt现在被分割为三部分:grunt, grunt-cligrunt-init

  1. npm模块grunt应该安装到你本地的项目中。它包含运行任务,插件加载的代码和逻等等。

  2. npm模块grunt-cli应该被安装在全局环境中。它会把grunt命令植入到你所有的路径中,因此你可以在任意位置执行grunt命令。对于它自身而言,它不会做任何事情; 它的工作就是在你已经安装的本地项目中加载和运行Grunt,无论是哪个版本的Grunt。想要了解更多关于它演变的信息,请阅读: npm 1.0:Global vc Local installation

  3. 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插件和任务”一节。

有些任务名称和选项都已经发生了变化。 可以通过上面的链接查看每个插件文档中的最新配置信息。

配置

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-concatgrunt-contrib-uglify插件都有一个banner选项.

现在使用<file_strip_banner:file.js>替代从文件中单独剥离banners,grunt-contrib-concatgrunt-contrib-uglify插件都有一个选项用于剥离/保留banners选项。

别名任务变化

当指定一个别名任务时,现在必须将运行的任务列表指定为一个数组:

  1. //v0.3.x(老格式)
  2. grunt.registerTask('default', 'jshint nodeunit concat');
  3. //v0.4.x(新格式)
  4. grunt.registerTask('default', ['jshint','nodeunit','concat']);

任务参数现在可以包含空格

上述别名任务的变化(任务列表必须指定为一个数组)使得参数包含空格变得可能。当在命令行中指定它们时,只需要确保传递给任务的参数是在引号中包含空格,这样它们才可以正确的解析。

正如你所了解的,在JS对象的属性中,字符串形式的属性可以包含空格。

  1. 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有了实质性的变化.

任务/插件作者

插件作者,请在你仓库中的README文件中清晰的表明你的Grunt插件的数字版本以避免与Grunt 0.3的兼容性问题。

任务

  • 多任务
    • 多个src-dest文件映射形式现在可以给每个目标指定一个files对象(这是可选的)。
  • this.files / grunt.task.current.files
    • this.files属性是一个遍历你的多任务得到一个src-dest文件映射对象数组。它一直都是一个数组, 即使通常只时指定一个单一的文件,它也会遍历返回一个数组。
    • 每个src-dest文件映射对象都有一个srcdest属性(对于其他情况, 取决于用户是否指定)。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插件。