Эрланг: Как получить доступ к флагам (аргументам) CLI как к переменным среды приложения?
-
06-07-2019 - |
Вопрос
Как получить доступ к флагу командной строки (аргументам) как к переменным среды в Erlang. (Как флаги, а не ARGV) Например:
RabbitMQ cli выглядит примерно так:
erl \
...
-sasl errlog_type error \
-sasl sasl_error_logger '{file,"'${RABBITMQ_SASL_LOGS}'"}' \
... # more stuff here
Если взглянуть на sasl.erl
, вы увидите строку:
get_sasl_error_logger() ->
case application:get_env(sasl, sasl_error_logger) of
% ... etc
Каким-то неизвестным волшебством переменная sasl_error_logger
становится кортежем erlang! Я попытался воспроизвести это в своем собственном erlang application
, но, похоже, я могу получить доступ к этим значениям только через init: get_argument
, который возвращает значение в виде строки. р>
Как передать значения через командную строку и получить легкий доступ к ним, используя термины erlang?
ОБНОВЛЕНИЕ Также для тех, кто ищет, чтобы использовать переменные среды «обычным» способом, используйте os: getenv (" THE_VAR ")
Решение
Убедитесь, что вы настроили файл конфигурации приложения
{application, fred,
[{description, "Your application"},
{vsn, "1.0"},
{modules, []},
{registered,[]},
{applications, [kernel,stdlib]},
{env, [
{param, 'fred'}
]
...
и затем вы можете настроить свою командную строку следующим образом:
-fred param 'billy'
Я думаю, что для этого вам нужно иметь параметр в конфигурации вашего приложения - я никогда не делал это иначе ...
Еще немного информации (проще, чем поместить ее в комментарии)
Учитывая это
{emxconfig, {ets, [{keypos, 2}]}},
Я, конечно, могу это сделать:
{ok, {StorageType, Config}} = application:get_env(emxconfig),
но (и это может быть важно) мое приложение запускается в данный момент (может, на самом деле, его просто нужно загрузить, а не запустить при просмотре кода application_controller).