Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何运行Elixir应用程序?_Elixir - Fatal编程技术网

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

运行Elixir应用程序的正确方法是什么

我正在通过以下方式创建一个简单的项目:

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
。有关更多信息,请参阅混合帮助运行。