Erlang: когда выполнять `inets: start ()`? - PullRequest
3 голосов
/ 03 декабря 2009

Какое место подходит для исполнения inets:start()?

  1. в модуле `applicationname_app '?
  2. в applicationname_sup модуль супервизора?
  3. в дочернем процессе, зависшем от супервизора? \
  4. где-то еще?

(я все еще борюсь с inets:httpd)

Примечание : ответ на мелодию "использовать загрузочный файл" не может быть, пожалуйста.

Ответы [ 3 ]

5 голосов
/ 03 декабря 2009

inets - это «автономное» приложение Erlang; inets:start() это просто псевдоним application:start(inets). Я думаю, что ответ во многом зависит от того, как вы поддерживаете свой код.

Если ваш код упакован как приложение , ваш файл .app должен содержать список inets, который требуется запустить перед вашим (см. Тег приложения). Запуск приложения с application:start(my_app). теперь гарантирует, что inets также запущен. Следствие: если вы создадите загрузочный файл, он также запустит инет для вас: -P

Если вы заинтересованы в том, чтобы не использовать приложения, я думаю, что выбор зависит от того, как работает ваш код. Если вам всегда будут нужны инеты для запуска, лучше начать с любого из ваших руководителей. Если это редко требуется, вы всегда можете убедиться, что он запускается с чем-то вроде:

ensure_app_started(App) ->
  case application:started(App) of
    ok -> ok;
    {error, already_started} -> ok;
    Error -> Error
  end.
0 голосов
/ 21 мая 2019

В 2019 году мы используем rebar3 до , создаем приложение и управляем его зависимостями.Для зависимостей, которые необходимо загрузить, вы добавляете их в rebar.config, и rebar3 загружает зависимости.Например, если вы добавите hackney (http-клиент) в 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]}
]}.

, то:

../your_app_name$ rebar3 compile

rebar3 загрузит hackney и скомпилируетвсе файлы в application.

Чтобы убедиться, что все ваши зависимости запускаются перед вашим приложением, вы добавляете имена зависимостей в:

src/your_app_name.app.src

Например,

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

здесь создается настоящий файл .app:

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

Чтобы запустить ваше приложение в оболочке вместе со всеми его зависимостями, вы:

../your_app_name$ rebar3 shell 

Приложение inets поставляется с erlangпоэтому его не нужно загружать, поэтому вы не указываете inets как зависимость в rebar.config (вы получите сообщение об ошибке, когда вы $ rebar3 compile).Вам по-прежнему нужно указывать inets как зависимость в вашем application в файле:

src/your_app_name.app.src

Но rebar3 сам использует inets (для загрузки ваших зависимостей), так что даже если вы этого не сделалиукажите inets в качестве зависимости в вашем приложении, inets все равно будет запущено до вашего приложения.Вы можете проверить это, не указав inets в качестве зависимости в вашем application, а затем выполнив:

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

Но не полагайтесь на это и НЕ указывайте inets в качестве зависимости в вашемприменение.

0 голосов
/ 20 мая 2019

Если ваш код упакован как приложение , укажите inets в файле ресурсов приложения:

% Filename: ebin/flamingo.app
{application, flamingo,
  [{vsn, "1.0.0"},
   {modules, [flamingo_app,
              flamingo_sup,
              flamingo]},
   {applications, [kernel,
                   stdlib,
                   inets]},
   {mod, {flamingo_app, []}}
  ]}.

Затем вы можете запустить приложение, используя application:ensure_all_started(flamingo). Это гарантирует, что inets запускается автоматически для вас (то есть нет необходимости явно вызывать inets:start()).

Например (при условии, что файл * .app и * .beam находятся в ebin/):

$ erl -pa ebin/
Eshell V9.2  (abort with ^G)
1> application:ensure_all_started(flamingo).
{ok,[inets,flamingo]}
...