Fork me on GitHub

Własne funkcje Mix'a

Some contents of this translation may be outdated.
Several major changes were applied to the original lesson since the last update.

Tworzenie własnych funkcji Mix’a dla projektów w Elixirze.

Spis treści

Wprowadzenie

Nie jest niczym niezwykłym chęć rozszerzenia funkcjonalności aplikacji napisanych w Elixirze. Można to osiągnąć dodając własne funkcje do Mix’a. Zanim zobaczymy jak to zrobić, przyjrzyjmy się jednej z już istniejących:

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

Jak możemy zobaczyć wyżej, framework Phoenix posiada własną funkcję do generowania nowego projektu. A co, jeśli chciałbyś mieć coś podobnego w swoim projekcie? Świetnie się składa, gdyż Elixir daje nam taką możliwość i czyni cały proces bardzo prostym do wykonania.

Konfiguracja

Utwórzmy prostą aplikację Mix’a.

$ mix new hello

* creating README.md
* creating .gitignore
* creating mix.exs
* creating config
* creating config/config.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.

A teraz, w pliku lib/hello.ex, który został dla nas wygenerowany, napiszmy funkcję, która wypisze na ekranie “Hello, World!”

defmodule Hello do

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

Własne funkcje Mix’a

Stwórzmy własną funkcję Mix’a. Najpierw utwórz nowy katalog i plik hello/lib/mix/tasks/hello.ex. W tym pliku zamieść poniższy kod:

defmodule Mix.Tasks.Hello do
  use Mix.Task

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

Zauważ jak rozpoczynamy tworzenie modułu z użyciem Mix.Tasks i nazwą, którą chcemy zawołać z linii komend. W drugiej linii wprowadzamy use Mix.Task, co pozwala nam skorzystać z zachowania Mix.Task w przestrzeni nazw. Następnie definiujemy funkcję run, w której ignorujemy przekazywany argument. W ciele tej funkcji wołamy funkcję say z naszego modułu Hello.

Funkcje Mix’a w akcji

Wypróbujmy naszą nową funkcję Mix’a. Dopóki jesteśmy katalogu głównym naszego projektu wszystko powinno działać. Z linii komend wywołaj mix hello. Powinieneś zobaczyć:

$ mix hello
Hello, World!

Mix jest bardzo przyjazny w użyciu i podpowiada nam właściwe komendy w przypadku zrobienia literówki:

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

Zwróciłeś uwagę, że wykorzystaliśmy nowy atrybut modułu, @shortdoc? Jest on bardzo pomocny przy dystrybuowaniu aplikacji, szczególnie, gdy użytkownik skorzysta z komendy mix help w konsoli.

$ mix help

mix app.start         # Starts all registered apps
...
mix hello             # Simply calls the Hello.say/0 function.
...

Podziel się