У меня есть рабочие (дети) в Application.start
. Их не следует запускать, если приложение Phoenix запущено из задачи, отличной от mix phx.server
(например, с mix ecto.reset
).
Итак, как узнать в Application.start
, что это mix phx.server
выполнение кода?
Как определить приложение Phoenix, запущенное с сервера `mix phx.server`?
Ответы (2)
Вы можете использовать Phoenix.Endpoint.server?(otp_app, endpoint)
, чтобы проверить, работает ли конечная точка на своем сервере под данным приложением. Вот документы: https://hexdocs.pm/phoenix/Phoenix.Endpoint.html#server?/2
Нет задокументированного способа проверить, было ли приложение запущено как задача, например. грамм. потому что приложение не mix
зависимости от производства.
Как правило, такая тонкая настройка решается путем использования :included_applications
в конфигурации проекта и загрузки их вручную при необходимости из Application.start/2
при необходимости с Application.ensure_started/2
. Для проверки условия можно использовать переменную среды (необязательно через псевдоним задачи):
LOAD_INCLUDED=app1,app2,app3 mix ecto.reset
и где-то в Application.start/2
:
"LOAD_INCLUDED"
|> System.get_env()
|> Enum.split(",")
|> Enum.map(&String.to_atom/1)
|> Application.ensure_started()
Если эти воркеры являются вашими собственными воркерами, это еще проще: просто вызовите Kernel.++/2
со списком условных воркеров на основе переменной среды.
Дополнительное примечание: в производственной среде приложение запускается как выпуск OTP без включения mix
, поэтому явная проверка на mix phx.server
не имеет смысла.