执行inets:start()的合适位置是什么?
applicationname_sup监控模块中?(我还在和inets:httpd做斗争)
备注:请回答“使用引导文件”这一调。
发布于 2009-12-03 14:47:03
is是一个“独立”的Erlang应用程序;inets:start()只是application:start(inets)的别名。我想答案在很大程度上取决于您如何维护代码。
如果您的代码打包为应用程序,那么您的.app文件应该根据需要在您的代码开始之前列出inets (请参阅应用程序标签)。现在,使用application:start(my_app).启动应用程序将确保inets也已启动。结果:如果您创建了一个引导文件,它也会为您启动inets :-P
如果您热衷于不使用应用程序,我想选择取决于您的代码是如何工作的。如果你总是需要内情开始,最好是由你的任何主管开始。如果很少需要它,您可以始终确保它的开头是这样的:
ensure_app_started(App) ->
case application:started(App) of
ok -> ok;
{error, already_started} -> ok;
Error -> Error
end.发布于 2019-05-21 03:36:46
在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 compilerebar3将下载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-20 18:13:46
如果您的代码打包为应用程序,请在应用程序资源文件中列出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]}https://stackoverflow.com/questions/1839862
复制相似问题