Ruby on rails 在Procfile中指定默认端口

Ruby on rails 在Procfile中指定默认端口,ruby-on-rails,foreman,procfile,Ruby On Rails,Foreman,Procfile,我正在使用foreman启动一系列服务,并在Procfile中包含以下行 web: bundle exec rails server -p ${PORT:-3000} 然而,当服务器启动时,它在默认的Foreman端口5000上启动,因此它看起来像是注入3000的语法,因为默认端口是错误的 我去寻找(有人给了我上面的那行,所以我想修复它),但实际上找不到任何关于如何注入默认值的具体文档 看着你看 所以很明显,${PORT:-3000}语法是错误的 设置默认端口的正确方法是什么?将Proc

我正在使用
foreman
启动一系列服务,并在Procfile中包含以下行

web:    bundle exec rails server -p ${PORT:-3000}
然而,当服务器启动时,它在默认的Foreman端口
5000
上启动,因此它看起来像是注入
3000
的语法,因为默认端口是错误的

我去寻找(有人给了我上面的那行,所以我想修复它),但实际上找不到任何关于如何注入默认值的具体文档

看着你看

所以很明显,
${PORT:-3000}
语法是错误的


设置默认端口的正确方法是什么?

Procfile
定义更改为指向自定义脚本文件:

bundle exec ./script/server
然后,创建
script/server
文件并配置默认值

#!/usr/bin/env bash
cd "$(dirname "$0")/.."
[ $PORT ] || PORT=3000

cmd="bundle exec rails server -p $PORT"
exec $cmd
否则,只需通过端口运行
Foreman

$ foreman start -p 3000

Foreman不是Bash;你不能像那样插入表达式

你可以这样做:

export PORT=3000 # only once; this is persistent
foreman run
或者像这样:

PORT=3000 foreman run # $PORT is not persistent this way
您可以扩展前者,将
export
命令放入一个
*rc
文件(例如
.rvmrc
)中,当您切换到此目录时,该文件将自动加载

或者,您可以将后者另存为脚本,并将其作为脚本运行。这是我的首选


(我还将
/bin
~/bin
添加到我的
路径
,并将默认脚本(如
rails s
)以相同的名称放入后者中。这样我就不必记住每个项目的“start server”命令。)

您可以创建
.env
文件,其中包含以下内容:
PORT=3000
,然后在
Procfile
中使用
web:bundle-exec-rails s-p$PORT

web:    bundle exec rails server -p ${SERVER_PORT:-3000}

这里有更多信息:

我不能对@PJSCopeland答案发表评论,所以我将此作为另一个答案添加。Foreman不是Bash,但命令编写正确(最后Foreman使用指定的命令执行
Process.spawn
)。这里的问题是,foreman在内部设置变量
PORT
,因此默认
PORT
值3000没有使用,因为它已经定义好了

我认为@Kote answer是最好的,但完成此任务的另一种方法是更改
端口
变量名,例如更改为
服务器端口

web:    bundle exec rails server -p ${SERVER_PORT:-3000}
然后,要更改默认的
服务器\u端口
执行:

SERVER_PORT=3100 foreman start

谢谢,这几乎奏效了,除了Foreman似乎在调用脚本之前将
PORT
设置为
5000
,因此从未调用
PORT=3000
。我选择修改
设置
rake任务以提供默认端口。同样正确-谢谢,唉,SP只允许我计算一个答案是正确的,@simone carletti获得了第一名。