Как определить приложение Phoenix, запущенное с сервера `mix phx.server`?

У меня есть рабочие (дети) в Application.start. Их не следует запускать, если приложение Phoenix запущено из задачи, отличной от mix phx.server (например, с mix ecto.reset).
Итак, как узнать в Application.start, что это mix phx.server выполнение кода?


person Vyacheslav Konovalov    schedule 28.05.2019    source источник


Ответы (2)


Вы можете использовать Phoenix.Endpoint.server?(otp_app, endpoint), чтобы проверить, работает ли конечная точка на своем сервере под данным приложением. Вот документы: https://hexdocs.pm/phoenix/Phoenix.Endpoint.html#server?/2

person José Valim    schedule 28.05.2019

Нет задокументированного способа проверить, было ли приложение запущено как задача, например. грамм. потому что приложение не 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 не имеет смысла.

person Aleksei Matiushkin    schedule 28.05.2019