Erlang application environment

我们知道 Erlang 的函数 application:get_env/2 可以返回 app 的配置信息。 例如我们有一个简单的 app 文件,放在 ./ebin/myapp.ebin 中。

{application,myapp,
             [{description,[]},
              {vsn,"1"},
              {registered,[]},
              {applications,[kernel,stdlib]},
              {mod,{myapp_app,[]}},
              {env,[{a,1},{b,2}]},
              {modules,[myapp_app,myapp_server,myapp_sup]}]}.
bash$ erl -pa ebin
Erlang/OTP 18 [erts-7.0] [source] [64-bit] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V7.0  (abort with ^G)
1> application:load(myapp).
ok
2> application:get_env(myapp,a).
{ok,1}
3> application:get_env(myapp,b).
{ok,2}
4>

除此之外,我们可以通过命令行来修改 app env 。

bash$ erl -pa ebin -myapp a first b second
Erlang/OTP 18 [erts-7.0] [source] [64-bit] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V7.0  (abort with ^G)
1> application:get_env(myapp,a).
undefined
2> application:load(myapp).
ok
3> application:get_env(myapp,a).
{ok,first}
4> application:get_env(myapp,b).
{ok,second}
5>

注意到在 application:load(myapp) 之前,application:get_env(myapp) 都是返回 undefined

我们也注意到,命令行的配置,覆盖掉了原来 myapp.app 中的默认配置。

还有一种办法可以指定 app 环境,就是利用配置文件。例如,我们写一个配置文件 a.config,如下

[{myapp,
  [{a,one},
   {b,two},
   {c,yes}]}].

然后执行命令

bash$ erl -pa ebin -config a.config
Erlang/OTP 18 [erts-7.0] [source] [64-bit] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V7.0  (abort with ^G)
1> application:get_env(myapp,a).
undefined
2> application:load(myapp).
ok
3> application:get_env(myapp,a).
{ok,one}
4> application:get_env(myapp,b).
{ok,two}
5> application:get_env(myapp,c).
{ok,yes}
6>

可以看到,我们还可以指定新的参数, c

配置文件 a.config 可以 myapp.app 中的配置,命令行参数 -myapp a yi 可以覆盖配置文件中的设置。

bash$ erl -pa ebin -config a.config -myapp a yi
Erlang/OTP 18 [erts-7.0] [source] [64-bit] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V7.0  (abort with ^G)
1> application:load(myapp).
ok
2> application:get_env(myapp,a).
{ok,yi}
3> application:get_env(myapp,b).
{ok,two}