Do you want to pick up from where you left of?
Take me there

Tâches Mix Personnalisées

Créer des tâches Mix personnalisées pour votre projet Elixir.

Introduction

Il n’est pas rare de vouloir étendre les fonctionnalités des applications Elixir en y ajoutant des tâches Mix personnalisées. Avant d’apprendre à en créer pour votre projet, jettons un coup d’oeil à une qui existe déjà:

$ mix phx.new my_phoenix_app

* creating my_phoenix_app/config/config.exs
* creating my_phoenix_app/config/dev.exs
* creating my_phoenix_app/config/prod.exs
* creating my_phoenix_app/config/prod.secret.exs
* creating my_phoenix_app/config/test.exs
* creating my_phoenix_app/lib/my_phoenix_app.ex
* creating my_phoenix_app/lib/my_phoenix_app/endpoint.ex
* creating my_phoenix_app/test/views/error_view_test.exs
...

Comme nous pouvons le voir dans la commande ci-dessus, le framework Phoenix dispose d’une tâche Mix pour générer un nouveau projet. Et si nous pouvions faire pareil dans notre projet? Et bien, la bonne nouvelle c’est que c’est possible et de façon très simple.

Initialisation

Commençons par créer une application minimaliste avec Mix.

$ mix new hello

* creating README.md
* creating .gitignore
* creating mix.exs
* creating lib
* creating lib/hello.ex
* creating test
* creating test/test_helper.exs
* creating test/hello_test.exs

Your Mix project was created successfully.
You can use "mix" to compile it, test it, and more:

cd hello
mix test

Run "mix help" for more commands.

Ensuite, dans le fichier lib/hello.ex que Mix a généré pour nous, créons une fonction pour afficher “Hello, World!”

defmodule Hello do
  @doc """
  Output's `Hello, World!` everytime.
  """
  def say do
    IO.puts("Hello, World!")
  end
end

Tâche Mix

Créons maintenant la tâche Mix. Ajoutez le fichier hello/lib/mix/tasks/hello.ex et placez-y les 7 lignes suivantes:

defmodule Mix.Tasks.Hello do
  @moduledoc "The hello mix task: `mix help hello`"
  use Mix.Task

  @shortdoc "Simply runs the Hello.say/0 command."
  def run(_) do
    # calling our Hello.say() function from earlier
    Hello.say()
  end
end

Notez comment nous avons déclaré defmodule avec Mix.Tasks et le nom que nous voulons donner à la commande. Sur la seconde ligne, nous avons ajouté use Mix.Task qui inclut les fonctionnalités de Mix.Task dans l’espace de noms. Ensuite, nous déclarons la function runqui ne prend aucun argument pour le moment. Dans cette fonction, nous appellons le module Hello et sa fonction say.

Tâches Mix en Action

Vérifions maintenant notre tâche Mix. Du moment que nous restons dans le même répertoire, cela devrait marcher. Exécutez mix hello dans la ligne de commande et vous devriez voir:

$ mix hello
Hello, World!

Mix est assez sympatique de nature. Il sait qu’il nous arrive de faire des erreurs de saisie ici et là, ainsi, il nous remonte des propositions le cas échéant:

$ mix hell
** (Mix) The task "hell" could not be found. Did you mean "hello"?

Avez-vous remarqué que nous avons introduit un nouvel attribut de module, @shortdoc? Il nous est très utile lors de lancement de notre application, comme quand un utilisateur éxécute mix help dans la ligne de commande.

$ mix help

mix app.start         # Starts all registered apps
...
mix hello             # Simply calls the Hello.say/0 function.
...
Caught a mistake or want to contribute to the lesson? Edit this lesson on GitHub!