什么地方适合表演inets:start()
?
- 在“applicationname_app”模块中?
- 在
applicationname_sup
主管模块中? - 在从主管挂起的子进程中?\
- 别的地方?
(我还在苦苦挣扎inets:httpd
)
注意:答案不能是“使用启动文件”的曲调,拜托。
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.
在 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
要在 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
在您的应用程序中指定为依赖项。
如果您的代码被打包为应用程序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]}