停止 Heroku 运行 npm start + 运行啥来代替?
Posted
技术标签:
【中文标题】停止 Heroku 运行 npm start + 运行啥来代替?【英文标题】:Stopping Heroku from running npm start + what to run instead?停止 Heroku 运行 npm start + 运行什么来代替? 【发布时间】:2015-11-17 00:25:48 【问题描述】:免责声明:我是 node.js/grunt/bower 新手。
我有一个 node.js/grunt/bower 应用程序,我正试图在 Heroku 上部署它。 Heroku 按预期构建应用程序,但随后它尝试运行我未在 package.json 文件中指定的“npm start”。这个命令失败了,我猜是因为它不是服务器应用程序,而且我看不到部署在 Heroku 上的实际应用程序。我的申请可以在这里找到:https://github.com/uzilan/sufusku
那么 - 我如何让 Heroku 不运行“npm start”命令,而应该运行什么?运行 grunt build 后,应用程序在 dist 文件夹中可用。
package.json:
"name": "sufusku",
"version": "0.0.1",
"description": "Sufusku - makes your annoying sudoku easier",
"repository":
"type": "git",
"url": "git://github.com/uzilan/sufusku.git"
,
"license": "(MIT OR Apache-2.0)",
"dependencies":
"bower": "^1.4.1",
"grunt": "0.4.5",
"grunt-cli": "0.1.13",
"grunt-contrib-clean": "^0.6.0",
"grunt-contrib-concat": "^0.5.1",
"grunt-contrib-connect": "^0.11.2",
"grunt-contrib-copy": "^0.8.0",
"grunt-contrib-cssmin": "^0.13.0",
"grunt-contrib-htmlmin": "^0.4.0",
"grunt-contrib-uglify": "^0.9.1",
"grunt-contrib-watch": "^0.6.1",
"grunt-ng-annotate": "^1.0.1",
"load-grunt-config": "^0.17.2",
"time-grunt": "^1.2.1"
,
"devDependencies": ,
"engines":
"node": ">=0.8.0"
,
"scripts":
"postinstall": "./node_modules/bower/bin/bower install && grunt build"
Gruntfile.js:
module.exports = function (grunt)
var appname = require('./package.json').name;
require('load-grunt-config')(grunt,
data:
dist: 'dist/' + appname,
app: 'src',
distscripts: 'dist/' + appname + '/scripts',
diststyles: 'dist/' + appname + '/styles',
disthtml: 'dist/' + appname,
disttest: 'dist/' + appname + '/test',
appstyles: 'src/css'
);
require('time-grunt')(grunt);
grunt.registerTask('build', ['clean:dist', 'ngAnnotate:application', 'uglify', 'htmlmin', 'cssmin', 'copy:serve', 'concat:components']);
grunt.registerTask('serve', ['build', 'connect:livereload', 'watch']);
grunt.registerTask('default', function ()
grunt.task.run(['build']);
);
;
Heroku 日志:
...
heroku[web.1]: Starting process with command `npm start`
app[web.1]: npm ERR! argv "/app/.heroku/node/bin/node" "/app/.heroku/node/bin/npm" "start"
app[web.1]: npm ERR! Linux 3.13.0-57-generic
app[web.1]: npm ERR! npm v2.11.3
app[web.1]: npm ERR! missing script: start
app[web.1]: npm ERR! Please include the following file with any support request:
app[web.1]: npm ERR!
app[web.1]: npm ERR! node v0.12.7
app[web.1]:
app[web.1]: npm ERR! /app/npm-debug.log
app[web.1]: npm ERR! If you need help, you may report this error at:
app[web.1]:
app[web.1]: npm ERR! <https://github.com/npm/npm/issues>
heroku[web.1]: Process exited with status 1
heroku[web.1]: State changed from starting to crashed
heroku[web.1]: State changed from crashed to starting
heroku[web.1]: Starting process with command `npm start`
app[web.1]: npm ERR! Linux 3.13.0-57-generic
app[web.1]: npm ERR! node v0.12.7
app[web.1]:
app[web.1]: npm ERR! missing script: start
...
【问题讨论】:
【参考方案1】:npm start
是默认的web
进程在 Procfile 中没有指定其他进程时运行。既然您说您不需要服务器(web
进程),那么首先要做的就是将默认进程缩放为零:
heroku scale web=0
接下来,您需要通过将进程类型添加到名为 Procfile
的文件中来告诉 Heroku 您要运行哪个进程而不是 web
。例如,如果您的应用以 node foobar.js
开头,您可以创建一个如下所示的 Procfile
:
bot: node foobar.js
然后将“机器人”进程扩展到至少一个:
heroku scale bot=1
看看上面的代码,即使你说它不是基于服务器的应用程序,它看起来也很像基于服务器的应用程序。你如何在本地启动你的应用程序?无论答案可能应该进入Procfile
,您可以在此处了解更多信息:
披露:我是 Heroku 的 Node.js 平台所有者
【讨论】:
好吧,我没有在我的应用程序中创建任何服务器,它只是一个没有后端的客户端 Angular 应用程序。在本地,我使用命令 grunt serve 启动应用程序,该命令在端口 9000 上启动 Web 服务器并启动指向 localhost:9000 地址的浏览器,但我想我无法在 Heroku 中运行它。我应该运行什么? 我还发现了这个:medium.com/@3runjo/…,它声称我需要一个 nodejs-grunt buildpack。你觉得有必要吗? 如果你想为你的客户端应用提供服务,你需要一个服务器。这里有一个使用 grunt 和 heroku 的教程:devcenter.heroku.com/articles/node-with-grunt 感谢您的帮助。我查看了教程并将其与此处找到的解决方案相结合:***.com/questions/26079611/… 我的 Procfile 中有heroku scake web=0
,但它仍会每隔几个小时尝试启动和崩溃。我怎样才能完全禁用它?我在这里有一个帖子***.com/questions/32850885/heroku-prevent-starting。谢谢【参考方案2】:
感谢您的回答。在尝试了上面提到的教程并查看了node.js TypeError: path must be absolute or specify root to res.sendFile [failed to parse JSON] 中的解决方案后,我最终编写了一个 server.js 文件来解决问题。它看起来像这样:
var express = require('express');
var app = express();
app.get('/', function (req, res)
res.sendFile(__dirname + '/index.html');
);
app.get(/^(.+)$/, function (req, res)
res.sendFile(__dirname + req.params[0]);
);
var PORT = process.env.PORT || 3000;
app.listen(PORT);
【讨论】:
您错误地将正确答案应用于自己 - 根据解决您的请求,它应该属于 @hunterloftis - 使用 procfile 指定在启动期间在给定 dyno 上运行哪个服务以上是关于停止 Heroku 运行 npm start + 运行啥来代替?的主要内容,如果未能解决你的问题,请参考以下文章
运行 npm start 时出现“index.js not found”,错误!代码 ELIFECYCLE 和 ENOENT
Discord.js 机器人 | Heroku 部署错误 | npm 错误!缺少脚本:开始
Heroku git push heroku master 运行 cd client && npm run build 不停