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}}