Foreman:在开发和生产中使用不同的Procfile

76

我有一个自制的Sinatra应用程序,我打算使用Heroku来托管它。

在开发中,我使用foreman和shotgun,并拥有以下Procfile:

web: shotgun config.ru -s thin -o 0.0.0.0 -p $PORT -E $RACK_ENV

它在开发和生产环境下都运行良好。但问题在于,我不想在生产环境中使用shotgun,因为它太慢了。

我们可以为开发和生产使用单独的Procfile配置吗?

4个回答

159
你可以使用两个 Procfile(例如 ProcfileProcfile.dev),并使用 foreman-f 选项 来选择不同的一个用于开发环境:
在开发环境中 (Procfile.dev 包含你的 shotgun web 进程):
foreman start -f Procfile.dev
在生产环境中,foreman start 命令会使用正常的 Procfile 文件。或者,您可以在应用程序中创建一个 bin 目录,并编写一个脚本,根据 $RACK_ENV 变量来启动适当的 Web 服务器(这是 Foreman 的创建者在评论中提出的一个想法,值得考虑)。


你是否知道是否有一种方法可以告诉Heroku运行不同的Procfile? - darko
1
@darko,没有办法指定一个自定义的 Procfile 让 Heroku 运行。它总是使用名为 Procfile 的那个文件。 - bgentry
16
为了避免使用“-f Procfile.dev”参数,您可以创建一个包含“procfile: Procfile.dev”的“.foreman”文件。 - Arctodus
@bgentry 那太可怕了,这是有意为之吗? - gnkdl_gansklgna
1
对于那些使用node-foreman的人来说,由于某种奇怪的原因,标志应该是-j而不是-f。 - Adam

25

@sharagoz的评论是关于所选答案的,我认为这是最佳选择,可以让您仍然使用foreman start而不添加额外的参数,并将您的 Procfile 保持与 Heroku 分离。

为了避免使用-f Procfile.dev参数,您可以创建一个包含procfile: Procfile.dev的.foreman文件 - Sharagoz

在我的应用程序根目录中,我创建了一个.foreman文件,正如评论所述

.foreman

procfile: Procfile.dev
Procfile
web: bundle exec puma -C config/puma.rb

Procfile.dev

web: bundle exec puma -C config/puma.rb
webpacker: ./bin/webpack-dev-server

4
这里有一个处理方法,只需要一个Procfile和环境变量即可。我在Heroku上使用这种方法。
设置你的环境变量:
export WEB_START_COMMAND='node index.js'
export WORKER_START_COMMAND='node worker.js'

Procfile文件:

web: eval '$WEB_START_COMMAND'
worker: eval '$WORKER_START_COMMAND'

在您的服务器和开发环境中导出不同的启动命令。

当命令中有$PORT时,这似乎无法正常工作。 - Pablote
1
如果你想在每个环境中都有不同的进程集,那么这种方法是有限的。@sharagoz 的解决方案更加灵活。 - Andy Waite
1
在我的情况下,这证明是一个相当不错的解决方案,简单而且有效。 - daemon_nio

2

对于那些仍在寻找答案的人,根据文档,不再需要使用foreman。你可以简单地使用:

heroku local -f Procfile.dev

这是最初的回答。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接