在Heroku上运行Grunt Build时出错

时间:2015-04-15 13:22:52

标签: node.js backbone.js heroku gruntjs bower

所以我在Heroku上安装了一个使用Yeoman Backbone generator生成的简单Backbone应用程序。我有一个非常简单的node.js服务器文件来提供Backbone应用程序,但由于缺少依赖项而无法部署到Heroku:

输出:

remote:        Loading "Gruntfile.js" tasks...ERROR
remote:        >> Error: Cannot find module 'connect-livereload'
remote:        Warning: Task "build" not found. Use --force to continue.

Server.js

var express = require('express');
var app = express();
var port = process.env.PORT || 8080;

app.use(express.static(__dirname + '/app'));
app.listen(port, function() {
    console.log('App is running on port ' + port);
});

packages.json

{
  "name": "ssi",
  "version": "0.0.0",
  "dependencies": {
    ...
  },
  "devDependencies": {
    "bower": "^1.4.1",
    "connect": "^3.3.5",
    "grunt": "^0.4.5",
    "grunt-cli": "^0.1.13",
    ...
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "scripts": {
    "start": "node server.js",
    "test": "mocha",
    "postinstall": "bower install && grunt build"
  }
}

最初我在运行bower install时遇到了问题,因为我没有为packages.json中的依赖项添加bower,所以我想,"也许我必须将它添加到普通的依赖项列表中devDependencies,因为这是我的部署过程。

所以我在依赖列表中添加了bower和grunt,但是在运行grunt build时它会失败,因为现在它无法找到build任务期间使用的任何所需的grunt模块。我认为必须有一种更好的方法让Heroku看到这些依赖项而不将它们添加到生产依赖项列表中。

我已经尝试将NODE_ENV变量设置为" development"像这样:

$ heroku config:set NODE_ENV=development

但这似乎没有任何效果。因此,由于我正在回答我自己的问题,所以有问题的假设问题是:

"如何让Heroku运行bower install和grunt build而无需将所有依赖项移动到生产依赖项列表中?"

N.B。 - 我意识到"正确"部署过程可能会将所有这些内容添加到分发文件夹中,包括依赖项。这个问题和答案针对的是那些像我一样的人,他们试图将他们当前的版本推送到Heroku,而不必设置更好的"部署过程。

1 个答案:

答案 0 :(得分:1)

最后,解决方案非常简单。在将我的应用程序推送到Heroku时,在控制台输出的前几行中,是以下行:

remote:        NPM_CONFIG_PRODUCTION=true

似乎将此环境变量更改为false将导致NPM也安装devDependencies列表。所以只需输入以下内容:

$ heroku config:set NPM_CONFIG_PRODUCTION=false

然后您应该看到Heroku构建并成功部署。