2009-07-31 6 views
7

Come si accede al flag della riga di comando (argomenti) come variabili di ambiente in Erlang. (Come le bandiere, non ARGV) Ad esempio:Erlang: Come accedere ai flag CLI (argomenti) come variabili di ambiente dell'applicazione?

RabbitMQ cli sembra qualcosa di simile:

erl \ 
... 
-sasl errlog_type error \ 
-sasl sasl_error_logger '{file,"'${RABBITMQ_SASL_LOGS}'"}' \ 
... # more stuff here 

Se si guarda sasl.erl si vede la linea:

get_sasl_error_logger() -> 
    case application:get_env(sasl, sasl_error_logger) of 
% ... etc 

Con qualche magia sconosciuta la sasl_error_logger variabile diventa una tupla di erlang! Ho provato a replicare questo nel mio Erlang application, ma mi sembra di essere solo in grado di accedere a questi valori tramite init:get_argument, che restituisce il valore come una stringa.

Come si passano i valori tramite la riga di comando e si è in grado di accedervi facilmente come termini di erlang?

UPDATE anche per chi cerca, per usare le variabili di ambiente nel modo 'normale' usare os:getenv("THE_VAR")

risposta

7

Assicurati di aver impostato un file di configurazione dell'applicazione

{application, fred, 
[{description, "Your application"}, 
    {vsn, "1.0"}, 
    {modules, []}, 
    {registered,[]}, 
    {applications, [kernel,stdlib]}, 
    {env, [ 
    {param, 'fred'} 
     ] 
... 

e quindi è possibile impostare il riga di comando in questo modo:

-fred param 'billy' 

Penso che sia necessario avere il parametro in configurazione dell'applicazione per fare questo - non ho mai fatto nessun altro modo ...

qualche info in più (più facile che mettere in un commento)

Dato questo

{emxconfig, {ets, [{keypos, 2}]}}, 

posso certamente fare questo:

{ok, {StorageType, Config}} = application:get_env(emxconfig), 

ma (e questo può essere importante) la mia applicazione viene avviata in questo momento (potrebbe in realtà solo bisogno di b E caricato e non effettivamente avviato guardando il codice application_controller).

+0

Alan, grazie per il suggerimento. Ho il param nel mio file '.app'. Buone notizie: ottengo il valore predefinito specificato nel file '.app'. Cattive notizie: non riesco a sovrascriverlo sulla riga di comando. –

+0

Nate, potresti mostrarci il tuo file app e il comando con cui avvii erlang? – Zed

+0

Sì, dovrebbe funzionare così probabilmente c'è qualcosa di sospetto nella tua linea di comando. Hai avviato la tua app quando accedi all'ambiente? –