我正在使用foreman
来启动一系列服务,并在Procfile中包含以下行。
web: bundle exec rails server -p ${PORT:-3000}
但是当服务器启动时,它会在默认的Foreman端口5000
上启动,因此看起来注入3000
作为默认端口的语法是错误的。
我去寻找(其他人给了我上面的这一行,所以我想修复它)并且实际上找不到任何关于如何注入默认值的具体文档。
查看the source您看到了
def expanded_command(custom_env={})
env = @options[:env].merge(custom_env)
expanded_command = command.dup
env.each do |key, val|
expanded_command.gsub!("$#{key}", val)
end
expanded_command
end
因此很明显${PORT:-3000}
语法错误。
设置默认端口的正确方法是什么?
答案 0 :(得分:2)
将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
答案 1 :(得分:2)
您可以使用以下内容创建.env
文件:PORT=3000
,然后使用Procfile
使用web: bundle exec rails s -p $PORT
答案 2 :(得分:0)
你可以这样做:
export PORT=3000 # only once; this is persistent
foreman run
或者像这样:
PORT=3000 foreman run # $PORT is not persistent this way
您可以扩展前者,将export
命令放入.*rc
文件(例如.rvmrc
),当您切换到此目录时,该文件会自动加载。
或者,您可以将后者保存为脚本并改为运行(如Simone Carletti suggests)。这是我的首选。
(我还将./bin
和~/bin
添加到我的PATH
,并将rails s
等默认脚本以相同的名称添加到后者中。然后我就不知道了必须记住每个项目的“启动服务器”命令。)
答案 3 :(得分:0)
我无法评论@PJSCopeland的答案,所以我将其添加为另一个答案。 Foreman不是Bash但是命令写得正确(最后领班用指定的命令执行Process.spawn
)。这里的问题是,工头在内部设置变量PORT
,因此默认PORT
值3000不会被使用,因为它已经被定义。
我认为@Kote答案是最好的,但完成此任务的另一种方法是更改PORT
变量名称,例如到SERVER_PORT
web: bundle exec rails server -p ${SERVER_PORT:-3000}
然后更改默认SERVER_PORT
执行:
SERVER_PORT=3100 foreman start