Erlang:何时执行`inets:start()`?
执行Erlang:何时执行`inets:start()`?,erlang,inets,Erlang,Inets,执行inets:start()的合适位置是什么 在“应用程序名\应用程序”模块中 在applicationname\u supsupervisor模块中 在一个孩子的过程中,被主管吊死\ 去别的地方 (我仍在与inets:httpd斗争) 注意:答案不可能是“使用启动文件”这一调。iNet是一个“独立”的Erlang应用程序inets:start()只是application:start(inets)的别名。我想答案很大程度上取决于如何维护代码 如果您的代码打包为,则您的.app文件应根据需要在
inets:start()
的合适位置是什么
applicationname\u sup
supervisor模块中inets:httpd
斗争)
注意:答案不可能是“使用启动文件”这一调。iNet是一个“独立”的Erlang应用程序inets:start()
只是application:start(inets)
的别名。我想答案很大程度上取决于如何维护代码
如果您的代码打包为,则您的.app文件应根据需要在启动之前列出
inets
(请参阅应用程序标签)。使用应用程序:启动(我的应用程序)启动应用程序。
现在将确保iNet也已启动。结果:如果您创建一个启动文件,它也会为您启动iNet:-P
如果您热衷于不使用应用程序,我想选择取决于代码的工作方式。如果您总是需要启动iNet,最好由您的任何主管启动。如果很少需要,您可以始终确保从以下内容开始:
ensure_app_started(App) ->
case application:started(App) of
ok -> ok;
{error, already_started} -> ok;
Error -> Error
end.
如果您的代码打包为应用程序资源文件中的列表
inets
:
% Filename: ebin/flamingo.app
{application, flamingo,
[{vsn, "1.0.0"},
{modules, [flamingo_app,
flamingo_sup,
flamingo]},
{applications, [kernel,
stdlib,
inets]},
{mod, {flamingo_app, []}}
]}.
然后可以使用启动应用程序。这可确保iNet为您自动启动(即无需显式调用iNet:start()
)
例如(假设*.app文件和*.beam文件位于ebin/
):
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
并编译应用程序中的所有文件
要确保在应用程序启动之前启动所有依赖项,请将依赖项的名称添加到:
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, []}
]}.
要在shell中启动应用程序及其所有依赖项,请执行以下操作:
../your_app_name$ rebar3 shell
inets
应用程序附带erlang,因此不需要下载它,因此您不需要在rebar.config中将inets指定为依赖项(当您$rebar3编译时将出现错误)。您仍然需要在文件的应用程序中指定inets作为依赖项:
src/your_app_name.app.src
但是rebar3
本身使用inets
(下载您的依赖项),因此即使您没有在应用程序中指定inets
作为依赖项,inets
仍会在应用程序启动之前启动。您可以通过在应用程序中不将inets
指定为依赖项来测试这一点,然后执行以下操作:
$ rebar3 shell
...
...
1> application:start(inets)
{error,{already_started,inets}}
但是,不要依赖于此,一定要在应用程序中指定inets
作为依赖项。@zed:再次感谢。假设我要将我的应用程序打包为应用程序
,我将如何从命令行启动它?(我主要是在做守护程序)。@zed:e.erl-sname守护程序-分离-启动启动\u sasl-s守护程序\u应用程序启动
?请给我举个例子。也将SASL添加到应用程序依赖项中。创建一个发布文件,然后创建一个引导脚本。然后-boot my_boot.@Zed:我最终决定重组并一直使用OTP(几乎没有启动文件!)。我选择了基于.app
的结构。谢谢你抽出时间。
src/your_app_name.app.src
$ rebar3 shell
...
...
1> application:start(inets)
{error,{already_started,inets}}