简单的elixir / mix项目问题

时间:2014-12-05 01:53:42

标签: elixir mix

我正在学习Elixir并尝试撰写一个简单的elixir hello世界示例,但是当我这样做时,我一直遇到这个错误"混合运行"

 (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

我只想转储#34; Hello World"当我跑步"混合运行"在控制台中,我不知道如何或在何处调用run()方法。谢谢

1 个答案:

答案 0 :(得分:4)

如果您想构建一个命令行应用程序,this blog post可能会帮助您。

除此之外,主管通常不会用于运行一次性进程,而是用于启动可以在以后调用的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调用run方法
mix run -e 'Collector.Sample.run'