错误 运行 Grunt 在 Heroku 上构建
Error running Grunt Build on Heroku
所以我在 Heroku 上安装了一个简单的 Backbone 应用程序,它是我使用 Yeoman Backbone generator 生成的。我有一个非常简单的 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
因为我没有将 bower 添加到 packages.json 的依赖项中,所以我想,“也许我必须将它添加到正常的依赖项列表而不是 devDependencies,因为这是我的部署过程。
所以我将 bower 和 grunt 添加到依赖项列表中,但是在 运行 grunt build
时它会失败,因为现在它找不到 [=] 期间使用的任何必需的 grunt 模块17=] 任务。我认为必须有更好的方法让 Heroku 看到这些依赖项,而无需将它们添加到生产依赖项列表中。
我已经尝试将 NODE_ENV 变量设置为 "development",如下所示:
$ heroku config:set NODE_ENV=development
但这似乎没有任何效果。因此,由于我正在回答我自己的问题,因此所讨论的假设问题是:
"How do I get Heroku to run bower install and grunt build without having to move all my dependencies into the production dependencies list?"
N.B. - 我意识到 "proper" 部署过程可能会将所有这些东西添加到分发文件夹中,包括依赖项。这个问题和答案是针对像我这样的人,他们只是试图将他们当前的构建推送到 Heroku 而不必设置 "better" 部署过程。
最后解决的办法很简单。在将我的应用程序推送到 Heroku 时,控制台输出的前几行是以下行:
remote: NPM_CONFIG_PRODUCTION=true
似乎将此环境变量更改为 false 将导致 NPM 也安装 devDependencies
列表。所以只需输入以下内容:
$ heroku config:set NPM_CONFIG_PRODUCTION=false
然后您应该会看到 Heroku 成功构建和部署。
所以我在 Heroku 上安装了一个简单的 Backbone 应用程序,它是我使用 Yeoman Backbone generator 生成的。我有一个非常简单的 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
因为我没有将 bower 添加到 packages.json 的依赖项中,所以我想,“也许我必须将它添加到正常的依赖项列表而不是 devDependencies,因为这是我的部署过程。
所以我将 bower 和 grunt 添加到依赖项列表中,但是在 运行 grunt build
时它会失败,因为现在它找不到 [=] 期间使用的任何必需的 grunt 模块17=] 任务。我认为必须有更好的方法让 Heroku 看到这些依赖项,而无需将它们添加到生产依赖项列表中。
我已经尝试将 NODE_ENV 变量设置为 "development",如下所示:
$ heroku config:set NODE_ENV=development
但这似乎没有任何效果。因此,由于我正在回答我自己的问题,因此所讨论的假设问题是:
"How do I get Heroku to run bower install and grunt build without having to move all my dependencies into the production dependencies list?"
N.B. - 我意识到 "proper" 部署过程可能会将所有这些东西添加到分发文件夹中,包括依赖项。这个问题和答案是针对像我这样的人,他们只是试图将他们当前的构建推送到 Heroku 而不必设置 "better" 部署过程。
最后解决的办法很简单。在将我的应用程序推送到 Heroku 时,控制台输出的前几行是以下行:
remote: NPM_CONFIG_PRODUCTION=true
似乎将此环境变量更改为 false 将导致 NPM 也安装 devDependencies
列表。所以只需输入以下内容:
$ heroku config:set NPM_CONFIG_PRODUCTION=false
然后您应该会看到 Heroku 成功构建和部署。