首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Erlang:什么时候执行‘`inets:start()’?

Erlang:什么时候执行‘`inets:start()’?
EN

Stack Overflow用户
提问于 2009-12-03 13:27:08
回答 3查看 2.2K关注 0票数 6

执行inets:start()的合适位置是什么?

  1. 在`applicationname_app模块里?
  2. applicationname_sup监控模块中?
  3. 在孩子的过程中从主管处吊起来?\
  4. 其他地方?

(我还在和inets:httpd做斗争)

备注:请回答“使用引导文件”这一调。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-12-03 14:47:03

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

如果您的代码打包为应用程序,那么您的.app文件应该根据需要在您的代码开始之前列出inets (请参阅应用程序标签)。现在,使用application:start(my_app).启动应用程序将确保inets也已启动。结果:如果您创建了一个引导文件,它也会为您启动inets :-P

如果您热衷于不使用应用程序,我想选择取决于您的代码是如何工作的。如果你总是需要内情开始,最好是由你的任何主管开始。如果很少需要它,您可以始终确保它的开头是这样的:

代码语言:javascript
复制
ensure_app_started(App) ->
  case application:started(App) of
    ok -> ok;
    {error, already_started} -> ok;
    Error -> Error
  end.
票数 5
EN

Stack Overflow用户

发布于 2019-05-21 03:36:46

在2019年,我们使用rebar3进行创建应用程序并管理它的依赖项。对于需要下载的依赖项,将它们添加到rebar.config中,rebar3将下载依赖项。例如,如果将hackney ( http客户端)添加到rebar.config中:

代码语言:javascript
复制
{erl_opts, [debug_info]}.
{deps, [
  {hackney, ".*", {git, "git://github.com/benoitc/hackney.git", {branch, "master"}}}
]}.

{shell, [
  % {config, "config/sys.config"},
    {apps, [http_client]}
]}.

那就做:

代码语言:javascript
复制
../your_app_name$ rebar3 compile

rebar3将下载hackney并编译application中的所有文件。

为了确保在应用程序之前启动所有依赖项,需要将依赖项的名称添加到:

代码语言:javascript
复制
src/your_app_name.app.src

例如,

代码语言:javascript
复制
{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文件在这里创建:

代码语言:javascript
复制
_build/default/lib/your_app_name/ebin/your_app_name.app

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

代码语言:javascript
复制
../your_app_name$ rebar3 shell 

inets应用程序附带erlang,因此不需要下载,因此您不需要在rebar.config中指定inets作为依赖项(当您使用$ rebar3 compile时会得到一个错误)。您仍然需要在文件中的application中将inets指定为依赖项:

代码语言:javascript
复制
src/your_app_name.app.src

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

代码语言:javascript
复制
$ rebar3 shell
...
...
1> application:start(inets)
{error,{already_started,inets}}

但是,不要依赖于此,并将inets指定为应用程序中的依赖项。

票数 1
EN

Stack Overflow用户

发布于 2019-05-20 18:13:46

如果您的代码打包为应用程序,请在应用程序资源文件中列出inets

代码语言:javascript
复制
% 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/中):

代码语言:javascript
复制
$ erl -pa ebin/
Eshell V9.2  (abort with ^G)
1> application:ensure_all_started(flamingo).
{ok,[inets,flamingo]}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1839862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档