Elixir的新手,我跟随JoséValim的帖子https://howistart.org/posts/elixir/1
由于我收到错误,我在让主管开始生孩子方面遇到了麻烦:
iex(1)> Portal.shoot(:orange)
{:error, {:invalid_child_spec, [:orange]}}
非常感谢帮助!
这是Portal模块
defmodule Portal do
use Application
def start(_type, _args) do
import Supervisor.Spec, warn: false
children = [
worker(Portal.Door, [])
]
opts = [strategy: :simple_one_for_one, name: Portal.Supervisor]
Supervisor.start_link(children, opts)
end
@doc """
Shoots a new door with the given `color`
"""
def shoot(color) do
Supervisor.start_child(Portal.Supervisor, [color])
end
这是Portal.Door模块和应该调用的start_link函数
defmodule Portal.Door do
def start_link(color) do
Agent.start_link(fn -> [] end, name: color)
end
答案 0 :(得分:1)
我遇到了与该教程相同的问题。如果您在1.4之前使用Mix版本,那么本教程是正确的。但是,在Mix 1.4+中,管理员代码应放在lib / portal / application.ex中的Portal.Application模块中。以下是Github对这一变化的请求,并围绕变革背后的思考进行了一些讨论:https://github.com/elixir-lang/elixir/pull/5275
要解决此问题,您需要删除添加到Portal模块的应用程序代码,并将其添加到lib / portal / application.ex中的Portal.Application模块。您的Portal.Application模块应如下所示:
defmodule Portal.Application do
@moduledoc false
use Application
def start(_type, _args) do
import Supervisor.Spec, warn: false
children = [
worker(Portal.Door, [])
]
opts = [strategy: :simple_one_for_one, name: Portal.Supervisor]
Supervisor.start_link(children, opts)
end
end
答案 1 :(得分:0)
也许你的混音版本是1.4
。将1.4
与--sup
混合自动包含在单个应用程序模块中的start / 2实现。在您的场景中,即lib/portal/application.ex
。您可以在那里修改启动功能。 The official release notes