Конфиг в Erlang приложениях

Решил описать как правильно создать конфиг для erlang приложения, так как сам с этим немного помучался и не совсем однозначно это описано в официальной документации.

Предположим у нас есть приложение someclient, которому нужны настройки такие как логин и пароль. Для этого нам придется создать три файла: само приложение, файл описания приложения и файл конфигурации.

Приложение у нас будет просто выводить значения конфигурации “someclient.erl”

-module(someclient).
-export([start/0]).

start() ->
    application:start(?MODULE),
    io:format("all config values: ~p~n", [application:get_all_env(?MODULE)]),
    {ok, ConfigValue} = application:get_env(?MODULE, login),
    io:format("value form config: ~p~n", [ConfigValue]),
    {ok, AppValue} = application:get_env(?MODULE, password),
    io:format("value from app: ~p~n", [AppValue]).

Теперь создадим файл описания приложения “someclient.app”. В этом файле мы тоже можем указать конфигурационные параметры. Но как мы увидим при выполнении, если в конфигурационном файле есть такие же ключи, то они имеют более высокий приоритет и заменят значение своим.

{application, someclient, [
    {env, [
        {login, "login from app"},
        {password, "password from app"}
    ]}
]}.

Ну и сам файл конфигурации “someclient.config”

[{someclient, [
   {login, "login from config"}
]}].

Запускать все это нужно предварительно скомпилировав

$ erl -compile someclient.erl; erl -noshell -s someclient
all config values: [{login,"login from app"},
                    {password,"password from app"},
                    {included_applications,[]}]
value form config: "login from app"
value from app: "password from app"

Как видите, значение логина перезатерлось значением из конфигурационного файла.