如何运行Elixir应用程序?
运行Elixir应用程序的正确方法是什么 我正在通过以下方式创建一个简单的项目:如何运行Elixir应用程序?,elixir,Elixir,运行Elixir应用程序的正确方法是什么 我正在通过以下方式创建一个简单的项目: mix new app 然后我可以做: mix run escript: [main_module: App] 基本上只编译一次我的应用程序。所以当我加上: IO.puts "running" 在lib/app.ex中,我第一次看到“running”,除非有一些更改,否则每次连续的运行都不会执行任何操作。使用生成的app.app,我接下来可以做什么 我当然知道我能做到: mix run escript:
mix new app
然后我可以做:
mix run
escript: [main_module: App]
基本上只编译一次我的应用程序。所以当我加上:
IO.puts "running"
在lib/app.ex
中,我第一次看到“running”
,除非有一些更改,否则每次连续的运行都不会执行任何操作。使用生成的app.app
,我接下来可以做什么
我当然知道我能做到:
mix run
escript: [main_module: App]
在mix.exs
中,提供def main(args):
然后:
mix escript.build
./app
但在我看来这有点麻烦
还有类似的东西:
elixir lib/app.exs
但是它不包括mix。exs
显然是我的应用程序中的依赖项所需的
mix run
会运行你的应用程序。只是,当您简单地将IO.put“something”
放在一个文件中,该行只在编译时进行计算时,它在运行时不会执行任何操作。如果你想在启动应用程序时启动一些东西,你需要在mix.exs
中指定它
通常,您需要一个可以启动的顶级应用程序。要实现这一点,请将mod
选项添加到您的mix.exs
:
def应用程序
[
#这是实现应用程序行为的任何模块的名称
mod:{NewMix,[]},
应用:[:记录器]
]
结束
然后在该模块中,您需要实现一个回调,该回调将在应用程序启动时调用:
defmodule NewMix do
使用应用程序
def启动(_类型,_参数)do
IO.puts“开始”
#再来点东西
结束
结束
start
回调实际上应该设置顶级进程或监控树根,但在这种情况下,您已经看到每次使用mix run
时都会调用它,尽管后面会出现错误
def start(_type,_args)do
IO.puts“开始”
Task.start(fn->:timer.sleep(1000);IO.puts(“完成睡眠”)end)
结束
在本例中,我们将在回调中启动一个简单的进程,该进程只休眠一秒钟,然后输出一些内容-这足以满足启动
回调的API,但我们没有看到完成休眠“
。这样做的原因是,默认情况下,mix run
将在回调完成后退出。为了避免这种情况发生,您需要使用混合运行--no-halt
——在这种情况下,VM不会停止
另一种启动应用程序的有用方法是iex-S mix
——它的行为方式与mix-run--no-halt
类似,但也会打开一个iex
外壳,您可以在其中与代码和正在运行的应用程序进行交互。您可以通过将mix.Task
导入模块而不是混合运行
我想这就是你要找的
除此之外,您只需运行mix
即可运行默认任务,而不是mix
。只需在mix.exs
中将default\u任务:“bot.run”
添加到def project do[…]end
的列表中即可。参考。好吧,这几乎就是我需要的!还有一件事,当没有任务
或代理
或主管
等时,您能解释一下返回了一个错误值::ok
错误吗。?这是如何工作的,为什么我们需要一个单独的过程?为什么我不能运行一些脚本来执行我需要的任何东西呢?应用程序回调必须返回一个监督树。如果不返回一个,它将失败。事实上,我甚至会将Paweł显示的最后一个表达式替换为:Supervisor.start_link[],strategy::one_for_one
。返回关闭的任务可能会导致应用程序在睡眠后失败。@squixy使用和定义应用程序的一些好处如下:如果您正在构建任何类型的长时间运行的应用程序,您几乎总是需要一个主管。我使用了一个任务
只是为了得到最小的正确程序,但正如Jose所提到的-你想在那里启动你的监督树。答案很好!不过有一个问题。你写了“只是当你把IO.puts“something”
放在一个文件中,这行只在编译时计算,在运行时它什么也不做。”这似乎与我看到的相符,但我不明白这其中的逻辑?为什么会这样?如果您想运行Elixir脚本(一个.exs
文件),但要在mix应用程序的上下文中运行,您可以运行mix run
。有关更多信息,请参阅混合帮助运行。