2009-07-31 11 views
7

Comment accéder à l'indicateur de ligne de commande (arguments) en tant que variables d'environnement dans Erlang. (Comme drapeaux, non ARGV) Par exemple:Erlang: Comment accéder aux indicateurs CLI (arguments) en tant que variables d'environnement d'application?

RabbitMQ cli ressemble à quelque chose comme:

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

Si on regarde sasl.erl vous voyez la ligne:

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

par magie inconnue le sasl_error_logger variable devient un erlang tuple! J'ai essayé de répliquer ceci dans mon propre erlang application, mais je semble être seulement capable d'accéder à ces valeurs par init:get_argument, qui renvoie la valeur comme chaîne.

Comment passer des valeurs via la ligne de commande et pouvoir y accéder facilement en tant que termes erlang?

MISE À JOUR aussi pour tous ceux qui cherchent à utiliser des variables d'environnement dans la « régulière » façon utiliser os:getenv("THE_VAR")

Répondre

7

Assurez-vous de mettre en place un fichier de configuration d'application

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

et vous pouvez configurer votre ligne de commande comme ceci:

-fred param 'billy' 

Je pense que vous devez avoir le paramètre dans votre configuration d'application pour le faire - je l'ai jamais fait de toute autre manière ...

Un peu plus d'informations (plus facile que de le mettre dans un commentaire)

Compte tenu de cette

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

je peux certainement faire:

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

mais (et cela peut être important) mon application est lancée à ce moment (peut effectivement juste besoin b e chargé et n'a pas réellement démarré en regardant le code application_controller).

+0

Alan, merci pour le conseil. J'ai le param dans mon fichier '.app'. Bonne nouvelle: j'obtiens la valeur par défaut spécifiée dans le fichier '.app'. Mauvaises nouvelles: je ne peux pas sembler l'ignorer sur la ligne de commande. –

+0

Nate, pourriez-vous nous montrer votre fichier d'application et la commande avec laquelle vous commencez erlang? – Zed

+0

Oui - cela devrait fonctionner donc il y a probablement quelque chose de louche dans votre ligne de commande. Avez-vous commencé votre application au moment où vous accédez à l'environnement? –