如何将带Supervisor的GenServer作为Elixir Application启动?
问题原因
你在mix.exs中配置了mod: {App, []},但代码里根本没有定义App模块。Elixir启动应用时,会调用mod指定模块的start/2函数初始化应用,因此会报错找不到该模块及对应函数。
解决方法
两种修复方式选其一即可:
方式一:新增App模块作为应用入口
在todos/lib/目录下创建app.ex文件(或直接在现有todos.exs末尾添加),实现Application行为:
defmodule App do use Application @impl true def start(_type, _args) do # 启动监督树 App.Supervisor.start() end end
保持mix.exs中的mod: {App, []}配置不变,重新启动应用即可。
方式二:直接用现有Supervisor作为应用入口
修改App.Supervisor模块,新增符合Application调用规范的start/2函数:
defmodule App.Supervisor do use Supervisor # 新增start/2,适配Application的调用要求 def start(_type, _args) do Supervisor.start_link(__MODULE__, []) end def init(_) do children = [ {App.Service,[]} ] Supervisor.init(children, strategy: :one_for_one) end end
然后修改mix.exs中的mod配置:
mod: {App.Supervisor, []}
重新启动应用即可。
额外建议
Elixir遵循模块名与文件名对应的约定,比如App.Service建议放在todos/lib/app/service.ex,App.Supervisor放在todos/lib/app/supervisor.ex,这样项目结构更清晰,也符合社区规范。
内容的提问来源于stack exchange,提问作者William
相关产品推荐
相关产品推荐

