Как настроить профили 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
, Таким образом, если нам нужно установить конфигурацию сервиса, мы можем просто обновить наш файл конфигурации, в котором также находится конфигурация, специфичная для этого приложения.
Насколько я знаю, это правильный метод для использования. Я не смог найти документацию, подтверждающую любой другой способ сделать это.