如何运行Elixir应用程序?
运行Elixir应用程序的正确方法是什么?
我正在创build一个简单的项目:
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
。 为了实现这一点,添加一个mod
选项到你的mix.exs
:
def application do [ # this is the name of any module implementing the Application behaviour mod: {NewMix, []}, applications: [:logger]] end
然后在那个模块中,你需要实现一个将在应用程序启动时调用的callback函数:
defmodule NewMix do use Application def start(_type, _args) do IO.puts "starting" # some more stuff end end
start
callback实际上应该设置您的顶级进程或监督树根,但在这种情况下,您将会看到,每次使用mix run
时都会调用它,但后面会出现错误。
def start(_type, _args) do IO.puts "starting" Task.start(fn -> :timer.sleep(1000); IO.puts("done sleeping") end) end
在这种情况下,我们在callback中启动一个简单的过程,只需要睡一秒钟,然后输出一些东西 – 这足以满足start
callback的API,但是我们没有看到"done sleeping"
。 原因是默认情况下,一旦callback完成执行, mix run
就会退出。 为了不发生这种情况,你需要使用mix run --no-halt
– 在这种情况下,虚拟机将不会停止。
另一种有用的启动应用程序的方法是iex -S mix
– 这将以类似的方式mix run --no-halt
,同时打开一个iex
shell,您可以与代码和正在运行的应用程序进行交互。
您可以通过将Mix.Task
导入模块而不是mix run
来运行任务。
我想这是你要找的。
最重要的是,而不是mix <task.run>
,你可以简单的运行mix
来运行默认的任务。 只需将default_task: "bot.run"
添加到def project do [..] end
的列表中, def project do [..] end
以mix.exs
。 请参阅这里 。