如何 运行 一个 Elixir 应用程序?

How to run an Elixir application?

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

我正在通过以下方式创建一个简单的项目:

mix new app

之后我可以做:

mix run

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

IO.puts "running"

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.

中的依赖项所必需的

mix run 运行 您的应用。只是当你简单地把 IO.puts "something" 放在一个文件中时,该行只在编译时计算,它在 运行 时什么都不做。如果您希望在启动您的应用程序时启动某些内容,您需要在 mix.exs.

中指定

通常你想要一个顶级的 Application 来开始。为此,请在 mix.exs:

中添加一个 mod 选项
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 但我们不'看到"done sleeping"。这样做的原因是默认情况下 mix run 将在该回调完成执行后退出。为了不发生这种情况,您需要使用 mix run --no-halt - 在这种情况下,VM 不会停止。

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

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

我想 this 就是您要找的。

最重要的是,您可以简单地 运行 mix 到 运行 默认任务,而不是 mix <task.run>。只需将 default_task: "bot.run" 添加到 mix.exs 中的 def project do [..] end 列表中。参考 here.