执行inets:start()
的适当位置是什么?
applicationname_sup
主管模块中?(我仍在努力与inets:httpd
)
注意:答案不能是调用“使用启动文件”,请。
答案 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年,我们使用rebar3
至create 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
中将inets指定为依赖项:
application
但是src/your_app_name.app.src
本身使用rebar3
(下载依赖项),因此即使您未在应用程序中将inets
指定为依赖项,inets
仍会开始使用您的应用之前。您可以通过在inets
中不将inets
指定为依赖项来进行测试,然后执行以下操作:
application
但是,不要依赖于此,请务必将$ rebar3 shell
...
...
1> application:start(inets)
{error,{already_started,inets}}
指定为应用程序中的依赖项。