2016-07-20 2 views
1

Je suis en train de commencer gproc comme dépendance à l'intérieur de l'application, mais il échoue avec:Démarrer GProc comme une dépendance

{error,{not_started,gproc}} 

Ceci est mon fichier app.src qui est utilisé par Rebar3 lorsque compilation:

{application, myapp, 
[{description, "MyApp"}, 
    {vsn, "0.1.0"}, 
    {registered, []}, 
    {mod, { my_app, []}}, 
    {applications, 
    [kernel, 
    stdlib, 
    sasl, 
    gproc <--- Dependency, and is compiled with Rebar3 
    ]}, 
    {env,[]}, 
    {modules, []}, 

    {maintainers, []}, 
    {licenses, []}, 
    {links, []} 
]}. 

Lors du démarrage de la coquille avec application:start(gproc). puis application:start(myapp). tout fonctionne à merveille. Je ne comprends pas pourquoi ...

Peut-être que c'est à cause d'une condition de course?

Le shell est lancé avec:

erl -pa _build/default/lib/*/ebin -boot start_sasl -eval "application:start(myapp)" 

Edit: Lorsque vous utilisez rebar3 shell tout fonctionne très bien, quelle est la différence par rapport à la commande shell que je utilise?

Répondre

1

Utilisez

application:ensure_all_started(myapp). 

La plaine start essaie de démarrer que l'application demandée, vérifier que les dépendances ne sont déjà en cours d'exécution.

Docs:

  • application:start/1:

    Lance l'application. S'il n'est pas chargé, le contrôleur d'application le charge d'abord en utilisant load/1. Il s'assure que toutes les applications incluses sont chargées, mais ne les démarre pas. Cela est supposé être pris en compte dans le code pour l'application.

  • application:ensure_all_started/1:

    équivalent à l'appel de démarrage/1,2 à plusieurs reprises sur toutes les dépendances qui ne sont pas encore commencé pour une application

+0

Merci! Difficile à trouver dans les docs. Si quelqu'un veut le chercher: http://erlang.org/doc/man/application.html –