非常教程

Grunt参考手册

常见问题

FAQ

如何安装grunt?

对于常规的安装说明,请阅读 Getting Started{{{快速入门}} 指南。如果在阅读完之后你需要更多的详细信息,你可以阅读更详细的的Installing grunt{{安装 Grunt}} 指南。

什么时候我将可以使用开发中的'某某'特性?

在 Installing grunt{{安装 Grunt}} 指南中介绍了如何安装已发布的和未发布的开发版本的Grunt。

Grunt可以在Windows上工作吗?

Grunt可以很好的在windows上工作,因为 Node.js 和 npm 都能够很好的在 windows上工作。通常情况下,问题在于Cygwin,因为它捆绑着一个较老版本的Node.js。

避免这个问题最好的办法是使用 msysGit installer 安装二进制的git和使用 Node.js installer 去安装二进制的nodenpm,然后使用内置的Windows command prompt 或 PowerShell 去替代Cygwin。

为什么我的异步任务不能执行完毕?

这是因为你忘记调用 this.async 方法来告知 Grunt 你的 task 是异步执行的。为了简化模型,Grunt 采用同步模式的编码风格,你可以通过在任务中调用 this.async() 切换到异步模式。

注意,如果 task 执行失败,可以传递 falsedone() 函数告知 Grunt 。

案例:

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

如何启用shell中的tab键自动补全功能?

为了给 grunt 增加 tab 键自动补功能,可以在你的~/.bashrc文件中添加下面一行代码:

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

当然,假设你已经使用npm install -g grunt在全局安装好了 Grunt 。因为 Grunt 目前仅仅支持 bash 命令。

我如让多个任务共享参数?

虽然每个任务可以使用它自己的参数,但是,这里有几个方法允许你在多个 task 中共享参数。

"动态的" 任务别名

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

鉴于任务别名是很简单的,一个普通的 task 可以使用grunt.task.run让一个函数作为“动态的”任务别名。在下面这个案例中,在命令行中执行grunt build:001,最终效果是执行foo:001bar:001baz:001这三个task。

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');
  // do something useful with target here
});
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

为什么出现 "Maximum call stack size exceeded(超出最大调用栈大小)" 的错误?

你可能是为某个任务创建的别名和其他任务重名了。 例如:grunt.registerTask('uglify', ['uglify:my_target']); 应该是 grunt.registerTask('myUglify', ['uglify:my_target']);

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

至少有两种方法。一种方法时利用 npm uninstall [GRUNT_PLUGIN] --save-dev 指令,这将从 package.json文件和 node_modules 目录下同时移除指定的插件。另一种方法时手工从 package.json 文件中删除依赖项,然后执行 npm prune 指令。

出现错误 "Fail to install with npm error: No compatible version found"

请确保安装了最新稳定版本的 NPM 和 Node.JS。


grunt 0.3 的相关问题

在Windows的 Grunt 0.3中,为什么当我尝试运行grunt时我的JS编辑器会打开?

如果你在 Gruntfile 所在的目录中时,当你输入 grunt 时 Windows 会尝试去执行那个文件。因此你需要输入grunt.cmd

另一个选择是使用DOSKEY命令去创建一个 Grunt 宏,请参考这篇文章。这样就可以使用grunt替代grunt.cmd了。

可以使用所示如下的DOSKEY命令:

DOSKEY grunt=grunt.cmd $*

常见问题相关

Grunt

Grunt 是基于 Node.js 的项目构建工具,它可以自动运行你所设定的任务。Grunt 拥有数量庞大的插件,几乎任何你所要做的事情都可以用 Grunt 实现。

Grunt目录

1.入门
2.API
3.安装
4.常见问题
5.项目脚手架