如何 运行 一个 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.
运行 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.