运行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
中依赖项所必需的。
答案 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)