如何使用rebar3配置httpc配置文件?

时间:2016-10-27 18:00:23

标签: erlang rebar3

使用rebar3时,如何为httpc的配置文件设置配置选项?

以下是唯一example来自erl -config inets.config,如下所示:

[{inets, 
[{services,[{httpc,[{profile, server1}]},
            {httpc, [{profile, server2}]}]}]
}].

我尝试将它用于我的rebar3项目结构。

代码

项目是使用rebar3创建的,具有标准的OTP布局:

rebar3 new release myapp

这是我的myapp/config/sys.config

[
  { myapp, []},
  {inets, [{services, [{httpc, [{profile, myapp}]}]}]}
].

rebar.config

{erl_opts, [debug_info]}.
{deps, []}.

{relx, [{release, { myapp, "0.1.0" },
         [myapp,
          sasl]},

        {sys_config, "./config/sys.config"},
        {vm_args, "./config/vm.args"},

        {dev_mode, true},
        {include_erts, false},

        {extended_start_script, true}]
}.

{profiles, [{prod, [{relx, [{dev_mode, false},
                            {include_erts, true}]}]
            }]
}.

以下是我的myapp.app.src文件的完整性:

{application, myapp,
 [{description, "An OTP application"},
  {vsn, "0.1.0"},
  {registered, []},
  {mod, { myapp_app, []}},
  {applications,
   [kernel,
    stdlib
   ]},
  {env,[]},
  {modules, []},

  {maintainers, []},
  {licenses, []},
  {links, []}
 ]}.

这是我要求从rebar的shell发出的请求:

$ ./rebar3 shell
1> ===> Booted myapp
1> ===> Booted sasl
...
1> httpc:request( "http://reddit.com", myapp).
** exception exit: {noproc,
                    {gen_server,call,
                     [httpc_myapp,
                      {request,
                       {request,undefined,<0.88.0>,0,http,
                        {"reddit.com",80},
                        "/",[],get,
                        {http_request_h,undefined,"keep-alive",undefined,
                         undefined,undefined,undefined,undefined,undefined,
                         undefined,...},
                        {[],[]},
                        {http_options,"HTTP/1.1",infinity,true,
                         {essl,[]},
                         undefined,false,infinity,...},
                        "http://reddit.com",[],none,[],1478280329839,
                        undefined,undefined,false}},
                      infinity]}}
     in function  gen_server:call/3 (gen_server.erl, line 212)
     in call from httpc:handle_request/9 (httpc.erl, line 574)

以下是没有个人资料的请求,以检查inets是否真正有效:

2> httpc:request( "http://reddit.com").

=PROGRESS REPORT==== 4-Nov-2016::13:25:51 ===
          supervisor: {local,inet_gethost_native_sup}
             started: [{pid,<0.107.0>},{mfa,{inet_gethost_native,init,[[]]}}]

=PROGRESS REPORT==== 4-Nov-2016::13:25:51 ===
          supervisor: {local,kernel_safe_sup}
             started: [{pid,<0.106.0>},
                       {id,inet_gethost_native_sup},
                       {mfargs,{inet_gethost_native,start_link,[]}},
                       {restart_type,temporary},
                       {shutdown,1000},
                       {child_type,worker}]
{ok,{{"HTTP/1.1",200,"OK"},...

2 个答案:

答案 0 :(得分:4)

rebar3本身使用inets http客户端,所以当它在shell中启动你的应用程序时,inets已经启动并配置好了。一个解决方法是在应用程序启动之前停止inets,as It's suggested by rebar3 developer(复制如下)。另一个是在控制台模式下启动你的版本:

./_build/default/rel/myapp/bin/myapp console

除此之外,您的项目还有另一个问题。你没有告诉过你想要为你启动inets。你应该在myapp.src

中加上这一行
{applications, [kernel, stdlib, inets]}

或者你可以列出rebar.config发布部分中的inets,告诉relx这个应用程序应该包含在发行版中并在启动时启动。

{relx, [{release, { myapp, "0.1.0" }, [inets, myapp, sasl]} ]}

阻止在rebar3 shell启动时加载Inet

以下是来自rebar3邮件列表的Fred Hebert的full answer副本:

  

我们确实需要inets来获取包,并且可能不会将其关闭   自动适用于所有用例,因为这可能会影响一般用法   在用户应用程序不使用的情况下,rebar3代理程序   inets,但仍然要求在后续运行中获取包。该   解决方法我建议使用钩子脚本。钩   脚本在我们启动用户应用程序之前运行,并且是常规的脚本:

#!/usr/bin/env escript 
main(_) -> application:stop(inets). 
     

然后您可以将脚本挂钩:

{shell, [{script_file, "path/to/file"}]} 
     

在rebar3.config中,或者用

rebar3 shell --script_file test/check_env.escript

答案 1 :(得分:0)

我在文档中找不到任何建议,rebar.config可以包含您想要的应用程序配置。

相反,应用程序配置通常保存在应用程序的配置目录中,并且如您给出的示例所示,在启动-config以指向配置文件时,必须使用erl标志。

如果您对making release使用rebar3并按script made with relx启动服务(默认情况下从_build/default/rel/<release_name>/bin/<release_name>开始),则应用程序配置文件将传递给erl。如果您的应用程序目录中存在配置文件,默认情况下在config/sys.config中,它将被视为应用程序配置,否则将进行空配置。您可以按relax' release option sys_config自定义其路径。

对于我们的软件,我们通常只有一个config/sys.config文件。结构与您提供的配置示例相同。请注意,配置文件可以包含许多不同服务的设置。例如,将inets与我们的混合物混合:

[{inets, [
     {services,[{httpc,[{profile, server1}]},
     {httpc, [{profile, server2}]}]}
 ]},
 {my_app, [
     {my_setting, "my value"}
 ]}
].

我们使用erl -config config/sys.config启动。 这样,如果我们需要设置服务配置,我们可以简单地更新我们的配置文件,该文件还包含特定于此应用程序的配置。

据我所知,这是正确的使用方法。我无法找到支持其他任何方式的文档。