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

Vlastné Mix Tasky

Vytváranie vlastných Mix taskov pre vaše Elixir projekty.

Úvod

Občas sa stane, že do svojho projektu potrebujete pridať špeciálnu funkcionalitu pridaním Mix taskov. Predtým, než si ukážeme, ako takéto vlastné Mix tasky vytvárať, pozrime sa na tie, ktoré už existujú:

$ 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
...

Ako môžeme vidieť z výstupu príkazu vyššie, framework Phoenix má vlastný Mix task určený na generovanie nového projektu. Čo keby sme mohli vytvoriť niečo podobné aj pre náš projekt? Dobrá správa! Elixir je na to pripravený, tak si poďme ukázať ako na to.

Nový projekt

Vytvorme si veľmi jednoduchú Mix aplikáciu.

$ 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.

V súbore lib/hello.ex, ktorý nám Mix vygeneroval, vytvorme jednoduchú funkciu ktorá nám vypíše reťazec “Hello, World!”

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

Vlastný Mix Task

Teraz si vytvorme vlastný Mix task. Vytvorme nový adresár a súbor hello/lib/mix/tasks/hello.ex. Do tohto súboru vložíme nasledujúci kód:

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

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

Všimnite si, že názov modulu začína na Mix.Task a nasleduje meno, ktorým chceme náš task spúšťať z príkazového riadku (teda v tomto prípade Hello). Nasleduje uvedenie modulu Mix.Task, ktorým do nášho modulu vnesieme rovnomenný behaviour (niečo ako interface v objektových jazykoch). Ďalej implementujeme povinnú funkciu run, ktorá bude nateraz ignorovať svoje argumenty. V tejto funkcii už len zavoláme našu funkciu say z modulu Hello.

Mix Tasky v akcii

Poďme si náš nový task vyskúšať. V príkazovom riadku zadajme mix hello a mali by sme vidieť nasledovné:

$ mix hello
Hello, World!

Mix je celkom prívetivý a tolerantný - vie, že ľudia robia občas chyby a preklepy, takže používa techniku nazývanú fuzzy string matching aby navrhol možné opravy:

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

Možno ste si všimli, že sme v definícii nášho tasku použili nový modulový atribút @shortdoc. Tento sa výborne hodí na popis špeciálnych taskov nášho projektu. Keď používateľ zadá do príkazového riadku v adresári nášho projektu mix help, uvidí aj popis nášho tasku hello:

$ 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!