我试图用exrm部署我的Elixir / Phoenix应用程序。这样可以正常工作,除非我在通过发行版"二进制文件"启动应用程序时无法读取config/config.exs
中定义的一些配置条目。
我的config/config.exs
锁定(为清晰起见,我删除了一些行):
use Mix.Config
config :phoenix, RestProxy.Router,
port: System.get_env("PORT")
# ...
config :logger,
backends: [:console, Logjam.LoggerBackend]
# ...
config :logjam, :forwarder,
app_name: "profileproxy",
enabled: false
我还通过
生成了conform
配置
mix conform.new
mix conform.configure
并保持不变。
如果我通过mix release
构建它,用./rel/my_app/bin/my_app start
启动它并连接远程控制台,我可以读取一些配置条目,但不能读取logjam:
> ./rel/rest_proxy/bin/rest_proxy remote_console
Erlang/OTP 17 [erts-6.1] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernelpoll:false] [dtrace]
Interactive Elixir (1.0.0) - press Ctrl+C to exit (type h() ENTER for help)
iex(my_app@127.0.0.1)1> Application.get_env(:logger, :backends)
[:console, Logjam.LoggerBackend]
iex(my_app@127.0.0.1)2> Application.get_env(:logjam, :forwarder)
nil
sys.config
中生成的rel/my_app/releases/0.0.1/
如下所示:
[{sasl,[{errlog_type,error}]},
{phoenix,
[{'Elixir',
[{'MyApp',
[{'Router',
[{cookies,true},
{debug_errors,true},
{host,<<"localhost">>},
{port,4000},
{session_key,<<"_rest_proxy_key">>},
{session_secret,<<"snip">>},
{ssl,false}]}]}]},
{'Elixir.MyApp.Router',
[{port,nil},
{ssl,false},
{host,<<"example.com">>},
{cookies,true},
{session_key,<<"_rest_proxy_key">>},
{session_secret,<<"snip">>}]},
{code_reloader,[{enabled,true}]}]},
{logger,
[{backends,[console,'Elixir.Logjam.LoggerBackend']},
{format,<<"$time $metadata[$level] $message">>},
{handle_otp_reports,true},
{handle_sasl_reports,true},
{metadata,[request_id]}]},
{logjam,[{forwarder,[{app_name,<<"profileproxy">>},{enabled,false}]}]}].
我使用的是elixir 1.0.0,phoenix 0.4.1和exrm 0.14.9。
任何想法/提示,为什么我无法阅读配置?
答案 0 :(得分:2)
我认为这是因为您的版本中没有加载名为logjam
的应用程序。引用:application.get_env
的Erlang文档:
如果未加载指定的应用程序,或者该进程 执行调用不属于任何应用程序,该函数 返回[]
在你的情况下,你看到nil,因为给定一个空关键字列表,Application.get_env
无法找到名称为:forwarder
的密钥,因此默认返回nil。