我正在学习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()
方法。谢谢
答案 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'