Johan van der Vleuten
Johan van der Vleuten

Reputation: 403

Start GProc as a dependency

I am trying to start gproc as a dependency inside the app, but it fails with:

{error,{not_started,gproc}}

This is my app.src file which is used by Rebar3 when compiling:

{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, []}
 ]}.

When starting from the shell with application:start(gproc). and then application:start(myapp). everything works beautifully. I don't understand why...

Maybe it is because of some sort of race condition?

The shell is started with:

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

Edit: When using rebar3 shell all works fine, what is the difference from the shell command I am using?

Upvotes: 1

Views: 97

Answers (1)

Nathaniel Waisbrot
Nathaniel Waisbrot

Reputation: 24493

Use

application:ensure_all_started(myapp).

The plain start tries to start only the requested application, only verifying that the dependencies are already running.

Docs:

  • application:start/1:

    Starts Application. If it is not loaded, the application controller first loads it using load/1. It ensures that any included applications are loaded, but does not start them. That is assumed to be taken care of in the code for Application.

  • application:ensure_all_started/1:

    Equivalent to calling start/1,2 repeatedly on all dependencies that are not yet started for an application

Upvotes: 1

Related Questions