¿Cuál es la forma correcta de ejecutar una aplicación Elixir?
Estoy creando un proyecto simple por:
mix new app
y después de eso puedo hacer:
mix run
que básicamente compila mi aplicación una vez. Entonces cuando agrego:
IO.puts "running"
en lib/app.ex
Veo "running"
solo por primera vez, cada consecutivo run
no hace nada a menos que haya algunos cambios. ¿Qué puedo hacer a continuación con generado app.app
?
Por supuesto que sé que puedo hacer:
escript: [main_module: App]
en mix.exs
, proporcionar def main(args):
y luego:
mix escript.build
./app
pero es un poco engorroso en mi opinión.
También hay algo como:
elixir lib/app.exs
pero mix.exs
obviamente no cuenta , lo cual es necesario para las dependencias en my app
.
.exs
archivo) pero hacerlo en el contexto de su aplicación mixta, puede ejecutarmix run <script>
. Consultemix help run
para obtener más información.Respuestas:
mix run
ejecuta su aplicación. Es solo que cuando simplemente colocaIO.puts "something"
en un archivo esa línea solo se evalúa en tiempo de compilación, no hace nada en tiempo de ejecución. Si desea que algo comience cuando inicie su aplicación, debe especificarlo en sumix.exs
.Por lo general, desea un nivel superior
Application
que comience. Para lograrlo, agregue unamod
opción a sumix.exs
:def application do [ # this is the name of any module implementing the Application behaviour mod: {NewMix, []}, applications: [:logger] ] end
Y luego, en ese módulo, debe implementar una devolución de llamada que se llamará al inicio de la aplicación:
defmodule NewMix do use Application def start(_type, _args) do IO.puts "starting" # some more stuff end end
La
start
devolución de llamada debería configurar su proceso de nivel superior o la raíz del árbol de supervisión, pero en este caso ya verá que se llama cada vez que lo usamix run
, aunque seguido de un error.def start(_type, _args) do IO.puts "starting" Task.start(fn -> :timer.sleep(1000); IO.puts("done sleeping") end) end
En este caso, estamos iniciando un proceso simple en nuestra devolución de llamada que solo duerme durante un segundo y luego genera algo; esto es suficiente para satisfacer la API de la
start
devolución de llamada, pero no vemos"done sleeping"
. La razón de esto es que, por defecto, semix run
cerrará una vez que la devolución de llamada haya terminado de ejecutarse. Para que eso no suceda, debe usarmix run --no-halt
; en este caso, la máquina virtual no se detendrá.Otra forma útil de iniciar su aplicación es
iex -S mix
: esto se comportará de manera similarmix run --no-halt
pero también abrirá uniex
shell donde puede interactuar con su código y su aplicación en ejecución.fuente
returned a bad value: :ok
error cuando no hayTask
, oAgent
oSupervisor
etc? ¿Cómo funciona eso y por qué necesitamos un proceso separado? ¿Por qué no puedo ejecutar un script que ejecute todo lo que necesito?Supervisor.start_link [], strategy: :one_for_one
. Devolver una tarea que se apaga puede hacer que la aplicación falle después de dormir.Supervisor
. UséTask
solo para tener el programa correcto más pequeño, pero como mencionó José, desea comenzar su árbol de supervisión allí.IO.puts "something"
en un archivo esa línea solo se evalúa en tiempo de compilación, no hace nada en tiempo de ejecución". que parece corresponde a lo que estoy viendo pero no entiendo la lógica de esto? ¿Por qué funciona de esa manera?Puede ejecutar tareas importando
Mix.Task
en su módulo en lugar demix run
.Creo que esto es lo que estás buscando.
Además de eso, en lugar de
mix <task.run>
, simplemente puede ejecutarmix
para ejecutar la tarea predeterminada. Simplemente agréguelodefault_task: "bot.run"
a la lista dedef project do [..] end
inmix.exs
. Consulte aquí .fuente