Frequently Asked Questions

如何安装 Grunt?

有关常规安装说明,请阅读新手入门指南。如果阅读后需要更具体的信息,请阅读全面的安装 Grunt指南。

我什么时候能使用开发中的功能 'X'?

关于安装 Grunt 的已发布和未发布开发版本,请参考安装 Grunt指南。

Grunt 能在 Windows 上工作吗?

Grunt 在 Windows 上运行良好,因为 Node.jsnpm 都能在 Windows 上正常工作。通常有问题的部分是 Cygwin,因为它捆绑了一个过时的 Node.js 版本。

避免此问题的最佳方法是使用 msysGit 安装程序安装 git 二进制文件,使用 Node.js 安装程序安装 nodenpm 二进制文件,并使用内置的 Windows 命令提示符PowerShell,而不是 Cygwin。

为什么我的异步任务没有完成?

很可能是因为你忘记调用 this.async 方法来告诉 Grunt 你的任务是异步的。为了简单起见,Grunt 使用同步编码风格,可以通过在任务体内调用 this.async() 切换到异步。

请注意,向 done() 函数传递 false 告诉 Grunt 任务已失败。

例如:

grunt.registerTask('asyncme', 'My asynchronous task.', function() {
  var done = this.async();
  doSomethingAsync(done);
});

如何启用 shell 选项卡自动完成?

要为 Grunt 启用 bash 选项卡自动完成,请在你的 ~/.bashrc 文件中添加以下行:

eval "$(grunt --completion=bash)"

这假设 Grunt 已使用 npm install -g grunt 全局安装。目前,仅支持 bash shell。

如何在多个任务间共享参数?

虽然每个任务可以接受自己的参数,但有几种方法可以在多个任务间共享参数。

"动态"别名任务

这是跨多个任务共享参数的首选方法。

别名任务不同,常规任务可以使用 grunt.task.run 使其有效地作为"动态"别名任务。在此示例中,在命令行上运行 grunt build:001 将导致运行 foo:001bar:001baz:001 任务。

grunt.registerTask('build', 'Run all my build tasks.', function(n) {
  if (n == null) {
    grunt.warn('Build num must be specified, like build:001.');
  }
  grunt.task.run('foo:' + n, 'bar:' + n, 'baz:' + n);
});

-- 选项

在多个任务间共享参数的另一种方法是使用 grunt.option。在此示例中,在命令行上运行 grunt deploy --target=staging 将导致 grunt.option('target') 返回 "staging"

grunt.registerTask('upload', 'Upload code to specified target.', function() {
  var target = grunt.option('target');
  // 在这里对目标做一些有用的事情
});
grunt.registerTask('deploy', ['validate', 'upload']);

注意,布尔选项可以仅使用键而不带值指定。例如,在命令行上运行 grunt deploy --staging 将导致 grunt.option('staging') 返回 true

全局变量和配置

在其他情况下,你可能想要公开一种设置配置或全局值的方法。在这些情况下,注册一个将其参数设置为全局或配置值的任务。

在此示例中,在命令行上运行 grunt set_global:name:peter set_config:target:staging deploy 将导致 global.name"peter",并且 grunt.config('target') 返回 "staging"。据推测,deploy 任务将使用这些值。

grunt.registerTask('set_global', 'Set a global variable.', function(name, val) {
  global[name] = val;
});

grunt.registerTask('set_config', 'Set a config property.', function(name, val) {
  grunt.config.set(name, val);
});

如何在发生错误时获取堆栈跟踪?

使用 --stack 选项查看堆栈跟踪。例如 grunt task --stack

为什么我会收到"超过最大调用堆栈大小"错误?

你可能创建了一个与常规任务同名的别名任务。 例如:grunt.registerTask('uglify', ['uglify:my_target']); 应该是 grunt.registerTask('myUglify', ['uglify:my_target']);

如何卸载或删除不需要的插件?

至少有两种方法。一种方法是使用 npm uninstall [GRUNT_PLUGIN] --save-dev,这将从你的 package.jsonnode_modules 中删除插件。你还可以手动从 package.json 中删除不需要的依赖项,然后运行 npm prune

错误"无法使用 npm 安装:未找到兼容版本"

确保你已安装 NPM 和 Node.JS 的最新稳定版本


Grunt 0.3 问题

在 Windows 上使用 Grunt 0.3 时,为什么我的 JS 编辑器在我尝试运行 Grunt 时打开?

如果你在与 Gruntfile 相同的目录中,Windows 会在你输入 grunt 时尝试执行该文件。因此你需要输入 grunt.cmd

另一种方法是使用 DOSKEY 命令创建 Grunt 宏,按照这些说明。这将允许你使用 grunt 而不是 grunt.cmd

你将使用的 DOSKEY 命令是:

DOSKEY grunt=grunt.cmd $*