如何运行Elixir应用程序?

时间:2015-06-06 21:33:15

标签: elixir

运行Elixir应用程序的正确方法是什么?

我正在创建一个简单的项目:

mix new app

之后我可以这样做:

mix run

基本上编译我的应用程序一次。所以当我添加:

IO.puts "running"
<{1>} lib/app.ex我第一次看到"running",除非有一些变化,否则每个连续run都不会做任何事情。生成app.app后我可以做什么?

当然我知道我能做到:

escript: [main_module: App]
mix.exs

,提供def main(args):然后:

mix escript.build
./app

但在我看来这有点麻烦。

还有类似的东西:

elixir lib/app.exs

但显然不会计算mix.exs,这是app中依赖项所必需的。

2 个答案:

答案 0 :(得分:86)

mix run会运行您的应用。只是当你将IO.puts "something"放在一个只在编译时评估该行的文件时,它在运行时什么都不做。如果您想在启动应用时启动某些功能,则需要在mix.exs

中指定

通常您需要一个可以开始使用的顶级Application。为此,请为mod添加mix.exs选项:

def application do
  [
    # this is the name of any module implementing the Application behaviour
    mod: {NewMix, []}, 
    applications: [:logger]]
end

然后在该模块中,您需要实现一个将在应用程序启动时调用的回调:

defmodule NewMix do
  use Application

  def start(_type, _args) do
    IO.puts "starting"
    # some more stuff
  end
end

start回调实际应该设置您的顶级进程或监督树根,但在这种情况下,您将看到每次使用mix run时都会调用它,但后面会出现错误。

def start(_type, _args) do
  IO.puts "starting"
  Task.start(fn -> :timer.sleep(1000); IO.puts("done sleeping") end)
end

在这种情况下,我们在回调中启动一个简单的过程,只需休眠一秒然后输出一些东西 - 这足以满足start回调的API但我们不会看到{ {1}}。这样做的原因是默认情况下"done sleeping"将在回调完成执行后退出。为了不发生这种情况,您需要使用mix run - 在这种情况下,VM不会被停止。

启动应用程序的另一种有用方法是mix run --no-halt - 这将以与iex -S mix类似的方式运行,但也会打开mix run --no-halt shell,您可以在其中与代码和您的代码进行交互运行应用程序。

答案 1 :(得分:6)

您可以通过将Mix.Task导入模块而不是mix run来运行任务。

我认为this正是您所寻找的。

除此之外,您只需运行mix <task.run>即可运行默认任务,而不是mix。只需将default_task: "bot.run"添加到def project do [..] end的{​​{1}}列表中即可。请参阅here