Erlang: Como bandeiras acesso CLI (argumentos) como variáveis ??de ambiente aplicação?
-
06-07-2019 - |
Pergunta
Como o flag de linha de comando de um acesso (argumentos) como variáveis ??de ambiente em Erlang. (Como bandeiras, não argv) Por exemplo:
RabbitMQ cli é algo como:
erl \
...
-sasl errlog_type error \
-sasl sasl_error_logger '{file,"'${RABBITMQ_SASL_LOGS}'"}' \
... # more stuff here
Se olharmos para sasl.erl
você vê a linha:
get_sasl_error_logger() ->
case application:get_env(sasl, sasl_error_logger) of
% ... etc
Por alguma magia desconhecida a variável sasl_error_logger
torna-se uma tupla erlang! Eu tentei replicar isso em minha própria application
erlang, mas parece-me ser apenas capaz de acessar estes valores via init:get_argument
, que retorna o valor como uma string.
Como é que uma passagem em valores através da linha de comando e ser capaz de acessá-los facilmente como termos Erlang?
Atualizar Também para quem procura, para variáveis ??de ambiente uso no uso maneira 'regular' os:getenv("THE_VAR")
Solução
Certifique-se de criar um arquivo de configuração do aplicativo
{application, fred,
[{description, "Your application"},
{vsn, "1.0"},
{modules, []},
{registered,[]},
{applications, [kernel,stdlib]},
{env, [
{param, 'fred'}
]
...
e, em seguida, você pode definir sua linha de comando assim:
-fred param 'billy'
Eu acho que você precisa ter o parâmetro na configuração do aplicativo para fazer isso - Eu nunca fiz isso de outra maneira ...
Alguns mais info (mais fácil do que colocá-lo em um comentário)
Dada esta ??p>
{emxconfig, {ets, [{keypos, 2}]}},
Eu posso certamente fazer isso:
{ok, {StorageType, Config}} = application:get_env(emxconfig),
e (e isso pode ser importante) minha aplicação é iniciada neste momento (pode realmente só precisa ser carregado e não começou realmente de olhar para o código application_controller).