如何检测从`mix phx.server`开始的phoenix应用程序?

时间:2019-05-28 10:10:46

标签: elixir phoenix-framework mix

我在Application.start有一些工人(孩子)。如果phoenix应用程序从mix phx.server以外的任务运行(例如,以mix ecto.reset运行),则不应启动它们。
因此,如何在Application.start中知道mix phx.server正在运行代码?

2 个答案:

答案 0 :(得分:2)

您可以使用Phoenix.Endpoint.server?(otp_app, endpoint)检查端点是否在给定应用程序下运行其服务器。这里是文档:https://hexdocs.pm/phoenix/Phoenix.Endpoint.html#server?/2

答案 1 :(得分:0)

没有记录的方法来检查应用程序是否作为任务启动,例如。 G。因为应用程序对生产没有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的显式检查为零。