Проблема с простым проектом эликсир / микс

Я изучаю Эликсир и пытаюсь составить ПРОСТОЙ эликсир, привет, мир, но я продолжаю сталкиваться с этой ошибкой, когда делаю "смешанный прогон"

 (Mix) Could not start application collector:
       Collector.start(:normal, []) returned an error:
       shutdown: failed to start child: Collector.Sample
(EXIT) nil

Что я делаю неправильно? Вот мой код без mix.exs и других некритичных файлов

defmodule Collector do
  use Application

  def start(_type, _args) do
    Collector.Supervisor.start_link
  end
end

defmodule Collector.Supervisor do
  use Supervisor

  def start_link do
    Supervisor.start_link(__MODULE__, :ok)
  end

  def init(:ok) do
    children = [
      supervisor(Collector.Sample, [])
    ]

    supervise(children, strategy: :one_for_one)
  end
end

defmodule Collector.Sample do
  use Application

  def start_link do

  end

  def run do
    IO.puts "Hello World"
  end

end

Я просто хочу сбросить "Hello World", когда я запускаю "mix run" в консоли, и я не знаю, как и где вызвать метод run(). Спасибо


person Coldstar    schedule 05.12.2014    source источник
comment
Вы должны убрать тег Erlang с вопроса; это не имеет ничего общего с Erlang. Попробуйте iex -S mix, а затем в iex выполните свой Collector.start   -  person Onorio Catenacci    schedule 05.12.2014
comment
@OnorioCatenacci, спасибо. удаленный тег   -  person Coldstar    schedule 05.12.2014


Ответы (1)


Если вы хотите создать приложение командной строки, возможно, это сообщение в блоге Вам поможет.

Помимо этого, супервизоры обычно используются не для запуска разовых процессов, а для запуска таких рабочих процессов, как GenServers, которые могут быть вызваны позже. Например, вы могли:

defmodule Collector.Supervisor do
  # ...

  def init(:ok) do
    children = [
      worker(Collector.Sample, [])
    ]

    supervise(children, strategy: :one_for_one)
  end
end

Затем реализуйте Collector.Sample как GenServer:

defmodule Collector.Sample do
  use GenServer

  # Client API

  def start_link do
    GenServer.start_link(__MODULE__, [], name: __MODULE__)
  end

  def run do
    GenServer.call __MODULE__, :run
  end

  # GenServer callbacks

  def handle_call(:run, _from, state) do
    IO.puts "Hello World"
    {:reply, :ok, state}
  end
end

Вы можете вызвать метод запуска прямо из mix run с флагом -e

mix run -e 'Collector.Sample.run'
person Patrick Oscity    schedule 05.12.2014
comment
Спасибо за направление и ваше время - person Coldstar; 05.12.2014