3

rebar3 を使用しているときに、 httpcのプロファイルの構成オプションを設定するにはどうすればよいですか?

これは、次のように見える唯一の例です。erl -config inets.config

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

rebar3 プロジェクト構造に採用してみました。

コード

プロジェクトは、標準の OTP レイアウトで rebar3 で作成されました。

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 のシェルから作成しようとしているリクエストです。

$ ./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"},...
4

2 に答える 2

5

rebar3 自体は inets http クライアントを使用するため、シェルでアプリケーションを起動すると、inet は既に起動されて構成されています。回避策の 1 つは、rebar3 開発者(以下にコピー)によって提案されているように、アプリケーションを開始する前に inets を停止することです。もう 1 つは、コンソール モードでリリースを起動することです。

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

それに加えて、プロジェクトには別の問題があります。あなたは、あなたのために inets を開始したいと言っていません。次の行が含まれている必要がありますmyapp.src

{applications, [kernel, stdlib, inets]}

または、リリース セクションに inets をリストrebar.configして、relx にこのアプリをリリースに含め、起動時に開始するように指示することもできます。

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

rebar3 シェルの起動時に Inet が読み込まれないようにする

以下は、rebar3 メーリング リストからの Fred Hebert による完全な回答のコピーです。

パッケージのフェッチには inets が必要ですが、すべてのユース ケースで自動的にオフにすることはありません。これは、ユーザー アプリケーションが inets を使用しない場合に rebar3 エージェントの一般的な使用法を損なう可能性があるためです。 . 私が提案する回避策は、フックスクリプトを使用することです。フック スクリプトは、ユーザー アプリケーションを起動する前に実行される、通常の escript です。

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

次に、スクリプトを次のようにフックできます。

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

rebar3.config、または

rebar3 shell --script_file test/check_env.escript
于 2016-11-05T07:00:28.760 に答える