Erlang: Comment accéder aux drapeaux (arguments) de la CLI en tant que variables d'environnement d'application?
-
06-07-2019 - |
Question
Comment accéder aux indicateurs de ligne de commande (arguments) en tant que variables d’environnement dans Erlang. (En tant que drapeaux, pas ARGV) Par exemple:
RabbitMQ cli ressemble à quelque chose comme:
erl \
...
-sasl errlog_type error \
-sasl sasl_error_logger '{file,"'${RABBITMQ_SASL_LOGS}'"}' \
... # more stuff here
Si vous regardez sasl.erl
, vous voyez la ligne:
get_sasl_error_logger() ->
case application:get_env(sasl, sasl_error_logger) of
% ... etc
Par magie inconnue, la variable sasl_error_logger
devient un tuple erlang! J'ai essayé de le reproduire dans ma propre application erlang
, mais il semble que je ne puisse accéder à ces valeurs que via init: get_argument
, qui renvoie la valeur sous forme de chaîne.
Comment passer des valeurs via la ligne de commande et pouvoir y accéder facilement en termes erlang?
UPDATE Les personnes souhaitant utiliser des variables d'environnement de manière "normale" doivent également utiliser os: getenv ("THE_VAR")
La solution
Assurez-vous de configurer 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 ensuite définir votre ligne de commande comme suit:
-fred param 'billy'
Je pense que pour cela, vous devez disposer du paramètre dans la configuration de votre application. Je ne l'ai jamais fait autrement ...
Quelques informations supplémentaires (plus faciles que de les mettre dans un commentaire)
Compte tenu de cela
{emxconfig, {ets, [{keypos, 2}]}},
Je peux certainement le faire:
{ok, {StorageType, Config}} = application:get_env(emxconfig),
mais (et cela peut être important), mon application est lancée à ce moment-là (il est peut-être nécessaire de simplement charger le logiciel et de ne pas commencer à regarder le code application_controller).