黑人的命也是命

入门

Grunt 和 Grunt 插件通过 npmNode.js 包管理器)安装和管理。Grunt 0.4.x 需要稳定的 Node.js 版本 >= 0.8.0

在设置 Grunt 之前,请确保您的 npm 是最新的,方法是运行 npm update -g npm(在某些系统上可能需要 sudo)。

如果您已经安装了 Grunt,现在正在寻找一些快速参考,请查看我们的 Gruntfile 示例 以及如何 配置任务

安装 CLI

使用 Grunt 0.3?请参阅 Grunt 0.3 说明

为了开始使用,您需要全局安装 Grunt 的命令行界面 (CLI)。您可能需要使用 sudo(对于 OSX、*nix、BSD 等)或以管理员身份运行命令行外壳(对于 Windows)才能执行此操作。

npm install -g grunt-cli

这将把 grunt 命令添加到您的系统路径中,允许从任何目录运行它。

请注意,安装 grunt-cli 不会安装 Grunt 任务运行器!Grunt CLI 的工作很简单:运行安装在 Gruntfile 旁边的 Grunt 版本。这允许在同一台机器上同时安装多个版本的 Grunt。

CLI 的工作原理

每次运行 grunt 时,它都会使用 node 的 require() 系统查找本地安装的 Grunt。因此,您可以从项目的任何子文件夹中运行 grunt

如果找到了本地安装的 Grunt,CLI 会加载 Grunt 库的本地安装,应用 Gruntfile 中的配置,并执行您请求它运行的任何任务。要真正了解发生了什么,请 阅读代码

使用现有的 Grunt 项目

假设已经安装了 Grunt CLI,并且项目已经使用 package.jsonGruntfile 配置,那么开始使用 Grunt 非常容易

  1. 切换到项目的根目录。
  2. 使用 npm install 安装项目依赖项。
  3. 使用 grunt 运行 Grunt。

就是这样。可以通过运行 grunt --help 列出已安装的 Grunt 任务,但通常最好从项目的文档开始。

准备新的 Grunt 项目

典型的设置包括向项目添加两个文件:package.jsonGruntfile

package.json:此文件由 npm 用于存储作为 npm 模块发布的项目的元数据。您将在该文件中将 grunt 和您的项目需要的 Grunt 插件列为 devDependencies

Gruntfile:此文件名为 Gruntfile.jsGruntfile.coffee,用于配置或定义任务并加载 Grunt 插件。当本文档提到 Gruntfile 时,它指的是一个文件,可以是 Gruntfile.jsGruntfile.coffee

package.json

package.json 文件位于项目的根目录中,与 Gruntfile 相邻,并且应该与项目源代码一起提交。在与 package.json 文件相同的文件夹中运行 npm install 将安装其中列出的每个依赖项的正确版本。

有几种方法可以为您的项目创建 package.json 文件

  • 大多数 grunt-init 模板会自动创建特定于项目的 package.json 文件。
  • npm init 命令将创建一个基本的 package.json 文件。
  • 从下面的示例开始,并根据需要进行扩展,遵循此 规范
{
  "name": "my-project-name",
  "version": "0.1.0",
  "devDependencies": {
    "grunt": "~0.4.5",
    "grunt-contrib-jshint": "~0.10.0",
    "grunt-contrib-nodeunit": "~0.4.1",
    "grunt-contrib-uglify": "~0.5.0"
  }
}

安装 Grunt 和 gruntplugins

将 Grunt 和 gruntplugins 添加到现有 package.json 的最简单方法是使用命令 npm install <module> --save-dev。这不仅会在本地安装 <module>,还会使用 波浪号版本范围 自动将其添加到 devDependencies 部分。

例如,这将在您的项目文件夹中安装最新版本的 Grunt,并将其添加到您的 devDependencies 中

npm install grunt --save-dev

对于 gruntplugins 和其他 node 模块,也可以这样做。如下面的示例所示,安装 JSHint 任务模块

npm install grunt-contrib-jshint --save-dev

插件 页面查看当前可用的 gruntplugins,以便在您的项目中安装和使用。

完成后,请确保将更新后的 package.json 文件与您的项目一起提交!

Gruntfile

Gruntfile.jsGruntfile.coffee 文件是一个有效的 JavaScript 或 CoffeeScript 文件,它位于项目的根目录中,与 package.json 文件相邻,并且应该与项目源代码一起提交。

Gruntfile 由以下部分组成

  • “包装器”函数
  • 项目和任务配置
  • 加载 Grunt 插件和任务
  • 自定义任务

Gruntfile 示例

在下面的 Gruntfile 中,项目元数据从项目的 package.json 文件导入到 Grunt 配置中,并且 grunt-contrib-uglify 插件的 uglify 任务被配置为压缩源文件并使用该元数据动态生成横幅注释。当在命令行上运行 grunt 时,默认情况下将运行 uglify 任务。

module.exports = function(grunt) {

  // Project configuration.
  grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
    uglify: {
      options: {
        banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n'
      },
      build: {
        src: 'src/<%= pkg.name %>.js',
        dest: 'build/<%= pkg.name %>.min.js'
      }
    }
  });

  // Load the plugin that provides the "uglify" task.
  grunt.loadNpmTasks('grunt-contrib-uglify');

  // Default task(s).
  grunt.registerTask('default', ['uglify']);

};

现在您已经看到了整个 Gruntfile,让我们看看它的组成部分。

“包装器”函数

每个 Gruntfile(和 gruntplugin)都使用这种基本格式,并且您所有的 Grunt 代码都必须在此函数内指定

module.exports = function(grunt) {
  // Do grunt-related things in here
};

项目和任务配置

大多数 Grunt 任务依赖于传递给 grunt.initConfig 方法的对象中定义的配置数据。

在此示例中,grunt.file.readJSON('package.json') 将存储在 package.json 中的 JSON 元数据导入到 grunt 配置中。因为 <% %> 模板字符串可以引用任何配置属性,所以可以这样指定文件路径和文件列表等配置数据,以减少重复。

您可以在配置对象中存储任何任意数据,只要它不与您的任务所需的属性冲突,否则将被忽略。此外,因为这是 JavaScript,所以您不仅限于 JSON;您可以在这里使用任何有效的 JS。如果需要,您甚至可以以编程方式生成配置。

与大多数任务一样,grunt-contrib-uglify 插件的 uglify 任务希望在其同名属性中指定其配置。在这里,指定了 banner 选项,以及一个名为 build 的 uglify 目标,该目标将单个源文件压缩到单个目标文件。

// Project configuration.
grunt.initConfig({
  pkg: grunt.file.readJSON('package.json'),
  uglify: {
    options: {
      banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n'
    },
    build: {
      src: 'src/<%= pkg.name %>.js',
      dest: 'build/<%= pkg.name %>.min.js'
    }
  }
});

加载 Grunt 插件和任务

许多常用的任务,如 连接压缩代码检查,都可以作为 grunt 插件 使用。只要插件在 package.json 中指定为依赖项,并且已经通过 npm install 安装,就可以在您的 Gruntfile 中使用一个简单的命令启用它

// Load the plugin that provides the "uglify" task.
grunt.loadNpmTasks('grunt-contrib-uglify');

注意: grunt --help 命令将列出所有可用任务。

自定义任务

您可以通过定义 default 任务来配置 Grunt 以默认运行一个或多个任务。在以下示例中,在命令行上运行 grunt 而不指定任务将运行 uglify 任务。这在功能上等同于显式运行 grunt uglify 甚至 grunt default。数组中可以指定任意数量的任务(带或不带参数)。

// Default task(s).
grunt.registerTask('default', ['uglify']);

如果您的项目需要 Grunt 插件未提供的任务,您可以在 Gruntfile 中定义自定义任务。例如,此 Gruntfile 定义了一个完全自定义的 default 任务,它甚至不使用任务配置

module.exports = function(grunt) {

  // A very basic default task.
  grunt.registerTask('default', 'Log some stuff.', function() {
    grunt.log.write('Logging some stuff...').ok();
  });

};

特定于项目的自定义任务不需要在 Gruntfile 中定义;它们可以在外部 .js 文件中定义,并通过 grunt.loadTasks 方法加载。

延伸阅读

  • 安装 grunt 指南详细介绍了如何安装特定版本(生产版本或开发版本)的 Grunt 和 grunt-cli。
  • 配置任务 指南深入解释了如何在 Gruntfile 中配置任务、目标、选项和文件,以及对模板、通配符模式和导入外部数据的解释。
  • 创建任务 指南列出了 Grunt 任务类型之间的差异,并展示了许多示例任务和配置。
  • 有关编写自定义任务或 Grunt 插件的更多信息,请查看 开发者文档