6

什么地方适合表演inets:start()

  1. 在“applicationname_app”模块中?
  2. applicationname_sup主管模块中?
  3. 在从主管挂起的子进程中?\
  4. 别的地方?

(我还在苦苦挣扎inets:httpd

注意:答案不能是“使用启动文件”的曲调,拜托。

4

3 回答 3

5

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

如果您的代码被打包为一个应用程序,您的 .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.
于 2009-12-03T14:47:03.270 回答
1

在 2019 年,我们用于rebar3创建应用程序并管理其依赖项。对于需要下载的依赖项,您将它们添加到rebar.configrebar3并将下载依赖项。例如,如果您将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

要在 shell 中启动应用程序及其所有依赖项,请执行以下操作:

../your_app_name$ rebar3 shell 

inets应用程序带有erlang,因此不需要下载,因此您无需在rebar.config中将inets指定为依赖项(您会收到错误消息$ rebar3 compile)。您仍然需要application在文件中指定 inets 作为依赖项:

src/your_app_name.app.src

rebar3它本身使用inets(下载你的依赖项),所以即使你没有在你的应用程序中指定inets依赖项,inets仍然会在你的应用程序之前开始。您可以通过在 中不指定inets为依赖项来测试它application,然后执行以下操作:

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

但是,不要依赖它,并inets在您的应用程序中指定为依赖项。

于 2019-05-21T03:36:46.717 回答
0

如果您的代码被打包为应用程序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]}
于 2019-05-20T18:13:46.630 回答