Quelle est la bonne façon de lancer une application Elixir?
Je crée un projet simple en:
mix new app
et après cela je peux faire:
mix run
qui compile essentiellement mon application une fois. Alors quand j'ajoute:
IO.puts "running"
dans lib/app.ex
Je vois "running"
seulement pour la première fois, chaque run
consécutif ne fait rien à moins que des changements ne soient apportés. Que puis-je faire ensuite avec app.app
Généré?
Bien sûr, je sais que je peux faire:
escript: [main_module: App]
dans mix.exs
, fournissez def main(args):
et ensuite:
mix escript.build
./app
mais c'est un peu lourd à mon avis.
Il y a aussi quelque chose comme:
elixir lib/app.exs
mais cela ne compte évidemment pas mix.exs
, ce qui est nécessaire pour les dépendances dans mon app
.
mix run
exécute votre application. C'est juste que quand vous mettez simplement IO.puts "something"
dans un fichier, cette ligne n’est évaluée que lors de la compilation, elle ne fait rien au moment de l’exécution. Si vous souhaitez que quelque chose commence lorsque vous démarrez votre application, vous devez le spécifier dans votre mix.exs
.
Habituellement, vous voulez un Application
de haut niveau qui sera démarré. Pour cela, ajoutez une option mod
à votre mix.exs
:
def application do
[
# this is the name of any module implementing the Application behaviour
mod: {NewMix, []},
applications: [:logger]]
end
Et ensuite, dans ce module, vous devez implémenter un rappel qui sera appelé au démarrage de l'application:
defmodule NewMix do
use Application
def start(_type, _args) do
IO.puts "starting"
# some more stuff
end
end
Le callback start
devrait en fait configurer votre racine de processus ou d'arborescence de supervision de niveau supérieur, mais dans ce cas, vous verrez déjà qu'il est appelé à chaque fois que vous utilisez mix run
, bien que suivi d’une erreur.
def start(_type, _args) do
IO.puts "starting"
Task.start(fn -> :timer.sleep(1000); IO.puts("done sleeping") end)
end
Dans ce cas, nous commençons un processus simple dans notre callback qui ne dort que pendant une seconde puis émet quelque chose - cela suffit pour satisfaire l’API du callback start
mais nous ne voyons pas "done sleeping"
. La raison en est que par défaut mix run
quittera à la fin de l'exécution du rappel. Pour que cela ne se produise pas, vous devez utiliser mix run --no-halt
_ - dans ce cas, le VM ne sera pas arrêté.
Un autre moyen utile de démarrer votre application est le iex -S mix
- cela se comportera de la même manière que mix run --no-halt
mais ouvrez également un iex
Shell où vous pouvez interagir avec votre code et votre application en cours d'exécution.
Vous pouvez exécuter des tâches en important Mix.Task
Dans votre module à la place de mix run
.
Je pense que this est ce que vous cherchez.
En plus de cela, au lieu de mix <task.run>
, Vous pouvez simplement exécuter mix
pour exécuter la tâche par défaut. Ajoutez simplement default_task: "bot.run"
Dans la liste de def project do [..] end
Dans mix.exs
. Reportez-vous ici .