Custom Mix Tasks
Wie man custom Mix tasks für ein Elixir-Projekt erstellt.
Einleitung
Es ist nicht unüblich die Funktionalität einer Elixir-Anwendung durch hinzufügen eines custom Mix tasks erweitern zu wollen. Bevor wir lernen, wie man einen spezifischen Mix task für ein Projekt erstellt, lass uns erstmal schauen, welche bereits vorhanden sind:
$ 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
...
Wie man am Shell-Kommando oben sehen kann, hat das Phoenix Framework einen custom Mix task, um ein neues Projekt zu erstellen. Was, wenn wir etwas Ähnliches für unser Projekt machen wollen? Nun, die gute Nachricht ist, dass wir das können und Elixir das auch noch einfach für uns macht.
Setup
Lass uns eine ganz einfache Mix-Anwendung anlegen:
$ 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.
In der Datei lib/hello.ex, die Mix für uns angelegt hat, lass uns eine einfache Funktion erstellen, die nur “Hello, World!” ausgibt:
defmodule Hello do
@doc """
Gib jedes Mal `Hello, World!` aus.
"""
def say do
IO.puts("Hello, World!")
end
end
Custom Mix Task
Lass uns unseren custom Mix task anlegen. Erstelle ein neues Verzeichnis und die Datei hello/lib/mix/tasks/hello.ex. Füge dieser Datei die folgenden 7 Zeilen Elixir Code hinzu:
defmodule Mix.Tasks.Hello do
@moduledoc "The hello mix task: `mix help hello`"
use Mix.Task
@shortdoc "Ruft einfach nur die Hello.say/0-Funktion auf."
def run(_) do
# Rufe unsere Hello.say()-Funktion von vorhin auf.
Hello.say()
end
end
Beachte wir wir das defmodule statement mit Mix.Tasks
und dem Namen, den wir auf der Kommandozeile zum starten unseres Tasks haben wollen, beginnen. In der zweiten Zeile benutzen wir use Mix.Task
, was uns das Mix.Task
-Verhalten in unseren Namespace importiert. Dann definieren wir eine Funktion run
, die bis jetzt alle Argumente ignoriert. In dieser Funktion rufen wir die Funktion say
aus dem Modul Hello
auf.
Mix Tasks in Aktion
Lass uns unseren Mix task austesten. Solang wir in dem Verzeichnis sind, sollte es funktionieren. Rufe mix hello
von der Kommandozeile auf und du solltest das Folgende sehen:
$ mix hello
Hello, World!
Mix ist standardmäßig ziemlich freundlich. Es weiß, dass jeder hier und da mal einen Tippfehler machen kann und benutzt eine Technik namens “fuzzy string matching”, um Vorschläge zu machen:
$ mix hell
** (Mix) The task "hell" could not be found. Did you mean "hello"?
Ist dir aufgefallen, dass wir ein neues Modulattribut, @shortdoc
, verwendet haben? Das ist nützlich, wenn wir unsere Anwendung ausrollen und beispielsweise ein Benutzer den Befehl mix help
in seinem Terminal aufruft.
$ mix help
mix app.start # Starte alle registrierten Anwendungen
...
mix hello # Ruft einfach nur die Hello.say/0-Funktion auf.
...
Caught a mistake or want to contribute to the lesson? Edit this lesson on GitHub!