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.
application
, how would I start it from the command line? (I am mostly doing daemons). – Pyrrho