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

Mix Tasks

Създаване на Mix tasks за вашите Elixir проекти.

Въведение

Не е необичайно да искате да добавите функционалност към вашата Elixir апликация, чрез Mix tasks. Преди да се научим, как да създаваме Mix tasks за нашите проекти, нека да погледнем съществуващите:

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

Както можем да видим от командата по-горе, Phoenix фреймуъркът има Mix task за генериране на нов проект. Ами ако можехме да създадем нещо подобно за нашия проект? Добрата новина, е че можем и Elixir прави това много лесно за нас.

Настройване

Нека създадем проста 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.

Нека направим проста функция, която просто ще покаже “Hello, World!”, в lib/hello.ex файлът, който Mix генерира за нас.

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

Наш Mix Task

Нека създадем наш Mix task. Създайте нова директория и файл hello/lib/mix/tasks/hello.ex. В този файл, добавете тези 7 реда Elixir:

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

Забележете как добавяме Mix.Tasks към defmodule и името, с което ще го извикаме от командния ред. На втория ред, добавяме use Mix.Task, който добавя Mix.Task функционалност в namespace-a. След това декларираме функция, която игнорира аргументи за сега. В тази функция, извикваме нашия Hello модул и say функцията.

Mix Tasks в действие

Нека изпробваме нашия mix task. Стига да сме в директорията, би трябвало да работи. От командния ред, изпълнете mix hello, и би трябвало да видите следното:

$ mix hello
Hello, World!

Mix знае, че всеки може да допусне грешка от време на време, за това използва техника наречена fuzzy string matching за да предложи поправка:

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

Забелязахте ли, че също така добавихме нов модулен атрибут @shortdoc? Това влиза в помощ, когато изпълняваме mix help от терминала.

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