2017-02-04 6 views
1

Новое в эликсир, и я отслеживаю вместе с пост Хосе валим в https://howistart.org/posts/elixir/1Elixir Кураторы: invalid_child_spec

У меня возникают проблемы, имеющий супервизора, чтобы начать ребенка, как я получаю сообщение об ошибке:

iex(1)> Portal.shoot(:orange) {:error, {:invalid_child_spec, [:orange]}}

Помощь была бы принята с благодарностью!

Вот модуль портала

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

Ваш код работает для меня. Вы уверены, что это точный код, который показывает эту ошибку? – Dogbert

+0

Да. Это была прямая копия от моего редактора. У меня есть другие функции в файлах (также из учебника), но они не должны иметь никакого эффекта, поскольку они не вызываются. @Dogbert было бы полезно увидеть все файлы .ex. – dhuenecke

+0

Да. Не могли бы вы сначала скопировать код в вопрос, добавить 2 недостающих 'end' и посмотреть, работает ли он? Я скопировал это и добавил 2 недостающих «конца», и это сработало для меня вчера. – Dogbert

ответ

0

Может быть, ваша версия микс 1.4. Mix 1.4 с --sup автоматически включается старт/2 реализация в отдельном модуле приложения. В вашей сцене, то есть в lib/portal/application.ex. Вы можете изменить функцию запуска. The official release notes

1

Я столкнулся с той же проблемой с этим учебником. Учебник верен, если вы используете версию Mix до 1.4. Однако в Mix 1.4+ код супервизора должен быть помещен в модуль Portal.Application в lib/portal/application.ex. Вот запрос Github для этого изменения с некоторой дискуссией вокруг мышления за изменением: https://github.com/elixir-lang/elixir/pull/5275

Чтобы устранить эту проблему, вам нужно удалить код приложения, добавленный в модуль портала, и добавить его в портал. Модуль приложения в lib/portal/application.ex. Ваш модуль 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