Erlang: when to perform `inets:start()`?

后端 未结 3 1562
小鲜肉
小鲜肉 2021-01-18 10:03

What is the appropriate place for performing inets:start() ?

  1. in `applicationname_app\' module?
  2. in applicationname_sup superv
3条回答
  •  一整个雨季
    2021-01-18 10:40

    In 2019, we use rebar3 to create an application and manage its dependencies. For dependencies that need to be downloaded, you add them to rebar.config, and rebar3 will download the dependencies. For example, if you add hackney (an http client) to rebar.config:

    {erl_opts, [debug_info]}.
    {deps, [
      {hackney, ".*", {git, "git://github.com/benoitc/hackney.git", {branch, "master"}}}
    ]}.
    
    {shell, [
      % {config, "config/sys.config"},
        {apps, [http_client]}
    ]}.
    

    Then do:

    ../your_app_name$ rebar3 compile
    

    rebar3 will download hackney and compile all the files in the application.

    To make sure that all your dependencies get started before your app, you add the names of the dependencies to:

    src/your_app_name.app.src
    

    For instance,

    {application, http_client,
     [{description, "An OTP application"},
      {vsn, "0.1.0"},
      {registered, []},
      {mod, {http_client_app, []}},
      {applications,
       [kernel,
        stdlib,
        hackney    %%%<=========HERE
       ]},
      {env,[]},
      {modules, []},
    
      {licenses, ["Apache 2.0"]},
      {links, []}
     ]}.
    

    The actual .app file gets created here:

    _build/default/lib/your_app_name/ebin/your_app_name.app
    

    To start your app in the shell along with all its dependencies, you do:

    ../your_app_name$ rebar3 shell 
    

    The inets application comes with erlang, so it doesn't need to be downloaded, so you don't specify inets as a dependency in rebar.config (you'll get an error when you $ rebar3 compile). You still need to specify inets as a dependency in your application in the file:

    src/your_app_name.app.src
    

    But rebar3 itself uses inets (to download your dependencies), so even if you didn't specify inets as a dependency in your application, inets would still get started before your app. You can test that by not specifying inets as a dependency in your application, then doing:

    $ rebar3 shell
    ...
    ...
    1> application:start(inets)
    {error,{already_started,inets}}
    

    But, don't rely on that and DO specify inets as a dependency in your application.

提交回复
热议问题