tutorial - ¿Cómo ejecutar la aplicación Elixir?
elixir strings (2)
Puede ejecutar tareas importando
Mix.Task
en su módulo en lugar de
mix run
.
Creo que this es lo que estás buscando.
Además de eso, en lugar de
mix <task.run>
, simplemente puede ejecutar
mix
para ejecutar la tarea predeterminada.
Simplemente agregue
default_task: "bot.run"
en la lista del
def project do [..] end
en
mix.exs
.
Consulte
here
¿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
run
consecutiva no hace nada a menos que haya algunos cambios.
¿Qué puedo hacer a continuación con
app.app
generado?
Por supuesto que sé que puedo hacer:
escript: [main_module: App]
en
mix.exs
, proporcione
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 no cuenta
mix.exs
obviamente, que es necesario para las dependencias en mi
app
.
mix run
ejecuta tu aplicación.
Es solo que cuando simplemente coloca
IO.puts "something"
en un archivo que la 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 su
mix.exs
.
Por lo general, desea una
Application
nivel superior que se inicie.
Para lograrlo, agregue una opción de
mod
a su
mix.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 devolución de llamada de
start
debería configurar el 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 usa la
mix 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 comenzando un proceso simple en nuestra devolución de llamada que solo duerme por un segundo y luego genera algo; esto es suficiente para satisfacer la API de la devolución de llamada de
start
pero no vemos
"done sleeping"
.
La razón de esto es que, por defecto, la
mix run
cerrará una vez que la devolución de llamada haya terminado de ejecutarse.
Para que eso no suceda, debe usar la
mix run --no-halt
, en este caso la VM no se detendrá.
Otra forma útil de iniciar su aplicación es
iex -S mix
, que se comportará de manera similar para
mix run --no-halt
pero también abrir un shell
iex
donde puede interactuar con su código y su aplicación en ejecución.