Erlang: come accedere ai flag CLI (argomenti) come variabili di ambiente dell'applicazione?
-
06-07-2019 - |
Domanda
In che modo si accede alla riga di comando (argomenti) come variabili di ambiente in Erlang. (Come flag, non ARGV) Ad esempio:
RabbitMQ cli assomiglia a:
erl \
...
-sasl errlog_type error \
-sasl sasl_error_logger '{file,"'${RABBITMQ_SASL_LOGS}'"}' \
... # more stuff here
Se uno guarda sasl.erl
vedi la linea:
get_sasl_error_logger() ->
case application:get_env(sasl, sasl_error_logger) of
% ... etc
Per qualche magia sconosciuta la variabile sasl_error_logger
diventa una tupla erlang! Ho provato a replicarlo nella mia erlang applicazione
, ma mi sembra di poter accedere a questi valori solo tramite init: get_argument
, che restituisce il valore come stringa.
Come si passano i valori tramite la riga di comando e si può accedere facilmente a questi termini come termini?
AGGIORNAMENTO Anche per chiunque cerchi, per utilizzare le variabili di ambiente in modo "normale" utilizzare os:getenv("THE_VAR")
Soluzione
Assicurati di impostare un file di configurazione dell'applicazione
{application, fred,
[{description, "Your application"},
{vsn, "1.0"},
{modules, []},
{registered,[]},
{applications, [kernel,stdlib]},
{env, [
{param, 'fred'}
]
...
e quindi puoi impostare la tua riga di comando in questo modo:
-fred param 'billy'
Penso che sia necessario avere il parametro nella configurazione dell'applicazione per farlo - non l'ho mai fatto in nessun altro modo ...
Altre informazioni (più facile che inserirle in un commento)
Dato questo
{emxconfig, {ets, [{keypos, 2}]}},
Posso certamente farlo:
{ok, {StorageType, Config}} = application:get_env(emxconfig),
ma (e questo potrebbe essere importante) la mia applicazione è stata avviata in questo momento (potrebbe effettivamente essere solo necessario caricarla e non essere effettivamente avviata guardando il codice application_controller).