21

我正在使用 node.js 用 Ja​​vaScript 编写的 Web 应用程序。我使用 Foreman,但我不想每次更改代码时都手动重新启动服务器。我可以告诉工头在处理 HTTP 请求(即重新启动node进程)之前重新加载整个 Web 应用程序吗?

4

6 回答 6

23

这是 Pendlepants 解决方案的调整版本。Foreman 查找 .env 文件来读取环境变量。您可以让 Foreman 切换它用于启动的命令,而不是添加包装器:

在 .env 中:

WEB=node app.js

在 dev.env 中:

WEB=supervisor app.js

在您的 Procfile 中:

web: $WEB

默认情况下,Foreman 将从 .env 读取(在生产环境中),但在 DEV 中只需运行以下命令:

foreman start -e dev.env
于 2012-04-05T22:30:41.460 回答
7

您可以为此目的使用重新运行

为此,您可能只实现 2 个命令:

  1. 宝石安装重新运行
  2. 重新运行工头开始

然后重新运行将在您的文件发生任何更改后自动重新启动过程。

于 2012-03-29T14:35:19.813 回答
6

如果你使用nodemon ,你可以做

nodemon --exec "foreman start"
于 2015-05-12T20:55:10.057 回答
3

问题不在于工头,而在于节点如何在新请求上不重新加载代码。解决方案是使用像supervisor这样的 npm 包以及 Foreman 的环境包装器。

首先,安装主管:

npm install -g supervisor

然后,编写 Foreman 可以调用的包装器 shell 脚本:

if [ "$NODE_ENV" == "production" ]; then
  node /path/to/app.js
else
  supervisor /path/to/app.js
fi

通过运行将包装脚本的权限设置为可执行chmod a+x /path/to/wrapper_script.sh

最后,更新工头以使用包装脚本。所以在你的Procfile

web: /path/to/wrapper_script.sh

现在,当您运行 Foreman 并且您的节点应用程序没有在生产中运行时,它应该在每个请求时重新加载。

于 2012-02-08T18:38:58.947 回答
2

我觉得 Peter Ehrlich 对原始问题的评论值得单独回答。我认为 local/dev 的不同 Procfile 绝对是最好的解决方案:https ://stackoverflow.com/a/10790514/133720

于 2013-11-14T21:43:59.160 回答
0

如果你使用 node-dev,你甚至不需要安装任何新东西。

您从 Procfile 加载的 .env 文件:

NODECMD=node-dev

你的档案:

web: $NODECMD app/server.js

你的工头命令

foreman start -e dev.env -p 9786

并在您的生产环境(heroku)中设置一个环境变量:

NODECMD=node
于 2014-10-28T00:29:59.930 回答