Elixir Supervisors:invalid_child_spec

时间:2017-02-04 16:54:39

标签: elixir

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

2 个答案:

答案 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