Erlang: ¿Cómo acceder a los indicadores de CLI (argumentos) como variables de entorno de la aplicación?
-
06-07-2019 - |
Pregunta
¿Cómo se accede a un indicador de línea de comando (argumentos) como variables de entorno en Erlang? (Como banderas, no ARGV) Por ejemplo:
RabbitMQ cli se parece a:
erl \
...
-sasl errlog_type error \
-sasl sasl_error_logger '{file,"'${RABBITMQ_SASL_LOGS}'"}' \
... # more stuff here
Si uno mira sasl.erl
verá la línea:
get_sasl_error_logger() ->
case application:get_env(sasl, sasl_error_logger) of
% ... etc
¡Por alguna magia desconocida la variable sasl_error_logger
se convierte en una tupla erlang! He intentado replicar esto en mi propia aplicación erlang
, pero parece que solo puedo acceder a estos valores a través de init: get_argument
, que devuelve el valor como una cadena.
¿Cómo se pasan valores a través de la línea de comandos y se puede acceder a ellos fácilmente como términos de erlang?
ACTUALIZACIÓN También para cualquiera que esté buscando, para usar las variables de entorno de la manera 'regular' use os:getenv("THE_VAR")
Solución
Asegúrese de configurar un archivo de configuración de la aplicación
{application, fred,
[{description, "Your application"},
{vsn, "1.0"},
{modules, []},
{registered,[]},
{applications, [kernel,stdlib]},
{env, [
{param, 'fred'}
]
...
y luego puede configurar su línea de comando de esta manera:
-fred param 'billy'
Creo que necesita tener el parámetro en la configuración de su aplicación para hacer esto; nunca lo he hecho de otra manera ...
Alguna información más (más fácil que ponerla en un comentario)
Dado esto
{emxconfig, {ets, [{keypos, 2}]}},
Ciertamente puedo hacer esto:
{ok, {StorageType, Config}} = application:get_env(emxconfig),
pero (y esto puede ser importante) mi aplicación se inicia en este momento (es posible que solo necesite cargarse y no comenzar mirando el código application_controller).