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

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

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

在这种情况下,我们在callback中启动一个简单的过程,只需要睡一秒钟,然后输出一些东西 – 这足以满足startcallback的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 [..] endmix.exs 。 请参阅这里 。