黑人的命也是命

从 0.3 升级到 0.4

请注意,即使您熟悉 grunt,也值得阅读新的 入门指南

Grunt 现在分为三个部分:gruntgrunt-cligrunt-init

  1. npm 模块 grunt 应该安装到您的项目本地。它包含运行任务、加载插件等的代码和逻辑。
  2. npm 模块 grunt-cli 应该全局安装。它将 grunt 命令添加到您的 PATH 中,以便您可以在任何地方执行它。它本身不做任何事情;它的工作是加载并运行已安装到您项目本地的 Grunt,而不管版本如何。有关此更改原因的更多信息,请阅读 npm 1.0:全局安装与本地安装
  3. init 任务已被拆分为其自己的 npm 模块 grunt-init。它应该使用 npm install -g grunt-init 全局安装,并使用 grunt-init 命令运行。在接下来的几个月里,Yeoman 将完全取代 grunt-init。有关更多信息,请参阅 grunt-init 项目页面

Grunt 0.3 说明

如果您从 Grunt 0.3 升级,请确保卸载全局 grunt

npm uninstall -g grunt

请注意,对于 0.3.x 版本,插件名称和任务配置选项可能与“Gruntfile”部分中显示的不同。

此文件在 0.3.x 版本的 Grunt 中名为 grunt.js

预先存在任务和插件

所有 grunt-contrib-* 系列插件都已准备好用于 Grunt 0.4。但是,为 Grunt 0.3 编写的第三方插件在更新之前不太可能继续与 0.4 一起使用。我们正在积极与插件作者合作,以确保这种情况尽快发生。

即将发布的 Grunt 版本将专注于解耦 grunt 的架构,以便插件不会受到未来更新的影响。

要求

  • Grunt 现在需要 Node.js 版本 >= 0.8.0

Gruntfile

  • “Gruntfile”已从 grunt.js 更改为 Gruntfile.js
  • 您的 Gruntfile.coffee 项目 Gruntfile*.coffee 任务文件支持 CoffeeScript(自动转换为 JS)。

有关更多信息,请参阅 入门指南 的“Gruntfile”部分。

核心任务现在是 Grunt 插件

Grunt 0.3 中包含的八个核心任务现在是独立的 Grunt 插件。每个都是一个离散的 npm 模块,必须按照 入门指南 的“加载 Grunt 插件和任务”部分安装为插件。

某些任务名称和选项已更改。请务必查看上面链接的每个插件的文档以获取最新的配置详细信息。

配置

Grunt 0.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>' 在文件列表中指定横幅,而是 grunt-contrib-concatgrunt-contrib-uglify 插件都有一个 banner 选项。

现在不是使用 '<file_strip_banner:file.js>' 从文件中单独剥离横幅,而是 grunt-contrib-concatgrunt-contrib-uglify 插件都有一个选项来剥离/保留横幅。

别名任务更改

指定别名任务时,现在必须将要运行的任务列表指定为数组。

// v0.3.x (old format)
grunt.registerTask('default', 'jshint nodeunit concat');
// v0.4.x (new format)
grunt.registerTask('default', ['jshint', 'nodeunit', 'concat']);

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

上述别名任务更改(任务列表必须指定为数组)使这成为可能。只需确保在命令行上指定包含空格的任务参数时用引号将其括起来,以便可以正确解析它们。

grunt my-task:argument-without-spaces "other-task:argument with spaces"

字符编码

添加了 file.defaultEncoding 方法来规范字符编码,并且所有 grunt.file 方法都已更新以支持指定的编码。

助手

Grunt 的助手系统已被删除,取而代之的是 node require。有关如何在 Grunt 插件之间共享功能的简洁示例,请参阅 grunt-lib-legacyhelpers。鼓励插件作者升级他们的插件。

API

Grunt API 从 0.3 到 0.4 发生了重大变化。

  • grunt
    • 删除了 grunt.registerHelpergrunt.renameHelper 方法。
  • grunt.config
    • 更改了 config.get 方法以自动递归扩展 <% %> 模板。
    • 添加了 config.getRaw 方法,该方法将检索原始(未扩展的)配置数据。
    • 更改了 config.process 方法,现在可以像从配置中检索值一样处理值,递归地扩展模板。此方法在 config.get 内部调用,但*不在* config.getRaw 内部调用。
  • 添加了 grunt.event,以便任务可以发出事件。
  • grunt.fail
    • 如果指定了 --no-color 选项,则不会发出哔声。
    • 添加了 fail.code 退出代码映射。
    • 删除了 fail.warnAlternate 方法。
  • grunt.file
  • grunt.task
    • 使用 task.registerTasktask.registerMultiTask 注册的任务都获得了一个 this.options 方法。
    • 添加了 task.normalizeMultiTaskFiles 方法,以方便将多任务 files 对象规范化为 this.file 属性。
    • 删除了 task.registerHelpertask.renameHelper 方法。
    • 删除了 task.searchDirs 属性。
    • 删除了 task.expand task.expandDirs task.expandFiles task.getFile task.readDefaults 方法(移至 grunt-init)。
  • grunt.package 反映了 grunt 的 package.json 中存储的元数据。
  • grunt.version 是 Grunt 的当前版本,以字符串形式表示。
  • grunt.template
    • 添加了 template.addDelimiters 方法来添加新的模板分隔符。
    • 添加了 template.setDelimiters 方法来选择模板分隔符。
    • inituser 模板分隔符已被删除,但如果需要,您可以使用 template.addDelimiters 再次添加它们(grunt-init 使用它来启用 {% %} 模板分隔符)。
  • grunt.util 替换了现在已删除的 grunt.utils
    • 更改了 util._ 以使用 Lo-Dash
    • 添加了 util.callbackify 方法。
    • 更改了 util.spawn 方法,使其行为更加规范,并将更一致的参数传递给其回调。

任务/插件作者

插件作者,请在您的存储库 README 上清楚地注明您的 Grunt 插件的哪个版本号破坏了与 Grunt 0.3 的兼容性。

任务

  • 多任务
    • 现在可以在 files 对象中的每个目标指定多个源目标文件映射(这是可选的)。
  • this.files / grunt.task.current.files
    • this.files 属性是一个源目标文件映射对象数组,将在您的多任务中对其进行迭代。它始终是一个数组,即使最常见的用例是指定单个文件,您也应该始终对其进行迭代。
    • 每个源目标文件映射对象都有一个 srcdest 属性(可能还有其他属性,具体取决于用户指定的属性)。src 属性已经从用户可能指定的任何 glob 模式中扩展。
  • this.filesSrc / grunt.task.current.filesSrc
    • this.filesSrc 属性是由所有指定的 src 属性匹配的所有文件的简化、唯一数组。对只读任务很有用。
  • this.options / grunt.task.current.options
    • this.options 方法可以在任务中用于规范化选项。在任务内部,您可以指定选项默认值,例如:var options = this.options({option: 'defaultvalue', ...});

插件

  • 已经为与 Grunt 0.4 兼容的插件创建了一个更新的 gruntplugin 模板,并且可以在独立的 grunt-init 中使用。

故障排除

  • 如果您之前安装过 Grunt 0.4 的开发版本或任何 grunt-contrib 插件,请务必先使用 npm cache clean 清理您的 npm 缓存,以确保您正在获取 Grunt 和 grunt-contrib 插件的最终版本。