当您使用 Mix 创建应用程序时,它总是将根主管文件添加到项目中。注意监督函数中的“子规范”数组是空的。
应用程序.ex:
defmodule App.Supervisor do
use Supervisor
def start_link do
Supervisor.start_link(__MODULE__, :ok)
end
def init(args) do
supervise([], [strategy: :one_for_one])
end
end
还会为您创建应用程序的入口点。通过我在网上找到的一些示例,我写了以下内容:
defmodule App do
def start(_type, _args) do
dispatch = :cowboy_router.compile([
{
:_,
[
# Simple JSON test.
{"/test", app.Handle.test, []},
]
}
])
{:ok, _} = :cowboy.start_http(
:http,
100,
[{:port, 8080}],
[{ :env, [{:dispatch, dispatch}]}]
)
App.Supervisor.start_link()
end
end
此应用程序有效,但如果我在 App.start() 中删除对 App.Supervisor.start_link() 的调用,它也有效。
那么在这种情况下,主管是做什么的呢?如果主管的子规范是空的,那有什么意义呢?
例如,在此处找到的 Elixir 示例中 - https://github.com/IdahoEv/cowboy-elixir-example/blob/master/lib/cowboy_elixir_example.ex - 您可以看到启动主管的调用已被注释掉第 65 行。
但在官方 Cowboy Erlang 示例中,此文件 - https://github.com/ninenines/cowboy/blob/master/examples/hello_world/src/hello_world_app.erl - 创建一个类似的没有子规范的根主管,然后调用它在此处的主应用程序文件中,第 22 行 - https://github.com/ninenines/cowboy/blob/master/examples/hello_world/src/hello_world_app.erl