为什么Grunt会失败?

Kev*_*161 12 node.js backbone.js gruntjs

我跑npm run-script grunt了之后得到了一个奇怪的错误,它告诉我node_modules/.bin/grunt失败了.

我正在关注一个教程,因为它是Backbone的新手(http://dailyjs.com/2012/11/29/backbone-tutorial-1/),

这是我的package.json档案.

{
  "name": "btask"
, "version": "0.0.1"
, "private": true
, "dependencies": {
    "requirejs": "latest"
  , "connect": "2.7.0"
  }
, "devDependencies": {
    "mocha": "latest"
  , "chai": "latest"
  , "grunt": "latest"
  , "grunt-exec": "latest"
  }
, "scripts": {
    "grunt": "node_modules/.bin/grunt"
  }
}
Run Code Online (Sandbox Code Playgroud)

这是错误的完整记录.

0 info it worked if it ends with ok
1 verbose cli [ 'node',
1 verbose cli   '/Users/Keva161/.nvm/v0.8.18/bin/npm',
1 verbose cli   'run-script',
1 verbose cli   'grunt' ]
2 info using npm@1.2.4
3 info using node@v0.8.18
4 verbose read json /Users/Keva161/Documents/Web Dev/Webapps/Node/btask/package.json
5 verbose run-script [ 'pregrunt', 'grunt', 'postgrunt' ]
6 info pregrunt btask@0.0.1
7 info grunt btask@0.0.1
8 verbose unsafe-perm in lifecycle true
9 silly exec sh "-c" "node_modules/.bin/grunt"
10 silly sh,-c,node_modules/.bin/grunt,/Users/Keva161/Documents/Web Dev/Webapps/Node/btask spawning
11 info btask@0.0.1 Failed to exec grunt script
12 error btask@0.0.1 grunt: `node_modules/.bin/grunt`
12 error `sh "-c" "node_modules/.bin/grunt"` failed with 2
13 error Failed at the btask@0.0.1 grunt script.
13 error This is most likely a problem with the btask package,
13 error not with npm itself.
13 error Tell the author that this fails on your system:
13 error     node_modules/.bin/grunt
13 error You can get their info via:
13 error     npm owner ls btask
13 error There is likely additional logging output above.
14 error System Darwin 12.2.1
15 error command "node" "/Users/Keva161/.nvm/v0.8.18/bin/npm" "run-script" "grunt"
16 error cwd /Users/Keva161/Documents/Web Dev/Webapps/Node/btask
17 error node -v v0.8.18
18 error npm -v 1.2.4
19 error code ELIFECYCLE
20 verbose exit [ 1, true ]
Run Code Online (Sandbox Code Playgroud)

aru*_*kjn 22

您正在谈论的教程使用grunt 0.3.Grunt从那时起已经更新,如果你在package.json文件中使用"grunt":"latest",那么你将默认获得grunt 0.4.

您可以浏览迁移指南以了解相关信息.

为了让咕噜咕噜地为本教程工作,你可以这样做 -

  • 全局安装grunt-cli npm install -g grunt-cli
  • 全局安装grunt-init npm install -g grunt-init
  • 在本地安装grunt(如果您按照教程已经安装)
  • 更改 "grunt": "node_modules\\.bin\\grunt"的package.json"grunt": "grunt"
  • 重命名grunt.js在根目录下Gruntfile.js
  • 更改 grunt.registerTask('default', 'exec copy-require');Gruntfile.jsgrunt.registerTask('default', ['exec','copy-require']);
  • npm run-script grunt在命令行中照常运行.事情应该现在正常.

您将获得一个包含r.js构建的构建目录.

如果您仍然无法得到它上面的步骤莫名其妙地工作,您可以更改grunt: "latest"grunt : "0.3"的package.json文件并运行npm install壳.


owy*_*gsk 5

arunkjn的回答将解决问题.虽然根据教程的意图,作者不想在全球范围内安装grunt,这也是我的目的.感谢arunkjn,我想你也可以:

  • 在本地安装grunt-cli npm install grunt-cli
  • 将根目录中的grunt.js重命名为Gruntfile.js
  • grunt.registerTask('default', 'exec copy-require');Gruntfile.js 更改为grunt.registerTask('default', ['exec','copy-require']);

npm run-script grunt再次做它应该工作.

  • 一般来说,我同情作者,因为我喜欢在本地使用工具,除非我知道我会定期使用它.我认为本地安装与本教程的精神保持一致 - 全局安装*然后*本地类的失败目的.为此+1和一个简单的答案. (2认同)

Jon*_*ues 2

我已经使用 grunt 和 npm 一段时间了,但我从未使用过run_script. 也许试试这个?

scripts部分通常用于在远程服务器上运行(即 Heroku 或 Travis)


移除scripts块。

然后做

npm install -g grunt
Run Code Online (Sandbox Code Playgroud)

此后可能需要重新启动终端。

cd myproject
npm install
grunt mytask
Run Code Online (Sandbox Code Playgroud)