Как обнаружить приложение Phoenix, запущенное из `mix phx.server`? - PullRequest
1 голос
/ 28 мая 2019

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

Ответы [ 2 ]

2 голосов
/ 28 мая 2019

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

0 голосов
/ 28 мая 2019

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

Sidenote: в работе, приложение запускается как выпуск OTP, без mix, и поэтому явная проверка для mix phx.server не имеет смысла.

...