使用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"},...
答案 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邮件列表的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
启动。
这样,如果我们需要设置服务配置,我们可以简单地更新我们的配置文件,该文件还包含特定于此应用程序的配置。
据我所知,这是正确的使用方法。我无法找到支持其他任何方式的文档。