Как настроить профили httpc с rebar3?

Как настроить параметры конфигурации для профилей httpc при использовании rebar3?

Вот единственный пример через 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, []}
 ]}.

Запросы

Вот запрос, который я пытаюсь сделать из оболочки арматуры:

$ ./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 ответа

Решение

Сама rebar3 использует http-клиенты inets, поэтому при запуске приложения в оболочке inets уже запускается и настраивается. Одним из обходных путей будет остановка inets до запуска вашего приложения, как это было предложено разработчиком rebar3 (скопировано ниже). Другой будет загрузить ваш релиз в режиме консоли:

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

Кроме того, есть еще одна проблема с вашим проектом. Вы не сказали, что хотите, чтобы инет был запущен для вас. Вы должны иметь эту строку в myapp.src:

{applications, [kernel, stdlib, inets]}

Или вы можете перечислить inets в rebar.config раздел release, чтобы сообщить relx, это приложение должно быть включено в релиз и запущено при загрузке.

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

Остановить загрузку Inets при запуске оболочки rebar3

Вот копия полного ответа Фреда Герберта из списка рассылки rebar3:

Нам нужны inets для извлечения пакетов, и мы, вероятно, не отключим его автоматически для всех случаев использования, так как это может поставить под угрозу общее использование агента rebar3 в случае, когда пользовательское приложение не использует inets, но все же запрашивает выборку пакетов в последующем запуске., Обходной путь, который я предложил бы, должен был бы использовать сценарий ловушки для этого. Скрипты Hook запускаются до загрузки пользовательских приложений и являются обычными сценариями:

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

Затем вы можете подключить скрипт с помощью:

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

в rebar3.config или с

rebar3 shell --script_file test/check_env.escript

Я не могу найти ничего в документации, чтобы предположить, что rebar.config может содержать конфигурацию приложения, которую вы хотите.

Вместо этого конфигурация приложения часто хранится в каталоге конфигурации вашего приложения, и, как в приведенном вами примере, вы должны использовать -config флаг при запуске erl указать на файл конфигурации.

Если вы используете rebar3 для создания релиза и запускаете сервис с помощью скрипта, созданного с помощью relx (из _build/default/rel/<release_name>/bin/<release_name> по умолчанию) файл конфигурации приложения передается erl для тебя. Если конфигурационный файл существует в каталоге вашего приложения, по умолчанию в config/sys.config, Это будет рассматриваться как конфигурация приложения, в противном случае будет сделана пустая конфигурация. Вы можете настроить его путь, выбрав вариант "Relax" sys_config,

Для нашего программного обеспечения у нас обычно был один config/sys.config файл. Структура такая же, как и в примере конфигурации, который вы предоставили. Обратите внимание, что файл конфигурации может содержать настройки для многих различных служб. Например, смешивая вкладки с одним из наших:

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

Запускаем с erl -config config/sys.config, Таким образом, если нам нужно установить конфигурацию сервиса, мы можем просто обновить наш файл конфигурации, в котором также находится конфигурация, специфичная для этого приложения.

Насколько я знаю, это правильный метод для использования. Я не смог найти документацию, подтверждающую любой другой способ сделать это.

Другие вопросы по тегам