web-dev-qa-db-fra.com

Comment exécuter l'application Elixir?

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.

74
Kamil Lelonek

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.

91
Paweł Obrok

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 .

7
holyxiaoxin