Erlang:何时执行`inets:start()`?

时间:2009-12-03 13:27:09

标签: erlang inets

执行inets:start()的适当位置是什么?

  1. 在`applicationname_app'模块?
  2. applicationname_sup主管模块中?
  3. 在一个挂在主管的儿童过程中?\
  4. 其他地方?
  5. (我仍在努力与inets:httpd

    注意:答案不能是调用“使用启动文件”,请。

3 个答案:

答案 0 :(得分:5)

inets是一个“独立”的Erlang应用程序; inets:start()只是application:start(inets)的别名。我想答案很大程度上取决于你如何维护你的代码。

如果您的代码打包为application,则.app文件应根据您的要求列出inets(请参阅应用程序标记)。使用application:start(my_app).启动您的应用程序现在将确保inets也已启动。结果:如果你制作一个启动文件,它也会为你启动inets :-P

如果您热衷于不使用应用程序,我猜选择取决于代码的工作方式。如果你总是需要启动inets,最好由你的任何主管开始。如果很少需要,您可以始终确保它以类似的方式启动:

ensure_app_started(App) ->
  case application:started(App) of
    ok -> ok;
    {error, already_started} -> ok;
    Error -> Error
  end.

答案 1 :(得分:0)

如果您的代码打包为application,请在应用程序资源文件中列出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]}

答案 2 :(得分:0)

在2019年,我们使用rebar3create an application并管理其依赖性。对于需要下载的依赖项,请将它们添加到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,因此不需要下载它,因此您无需在rebar.config中将inets指定为依赖项({{1 }}。您仍然需要在文件的$ rebar3 compile中将in​​ets指定为依赖项:

application

但是src/your_app_name.app.src 本身使用rebar3(下载依赖项),因此即使您未在应用程序中将inets指定为依赖项,inets仍会开始使用您的应用之前。您可以通过在inets中不将inets指定为依赖项来进行测试,然后执行以下操作:

application

但是,不要依赖于此,请务必将$ rebar3 shell ... ... 1> application:start(inets) {error,{already_started,inets}} 指定为应用程序中的依赖项。