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

Custom Mix Tasks

Membuat task Mix custom untuk project Elixir anda.

Perkenalan

Tidak jarang kita ingin mengembangkan (extend) fungsionalitas aplikasi Elixir kita dengan menambahkan task Mix sendiri. Sebelum kita belajar tentang cara membuat task Mix spesifik untuk project kita, mari lihat salah satu yang sudah ada:

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

Sebagaimana bisa kita lihat dari perintah shell di atas, Phoenix Framework punya sebuah task Mix custom untuk membuat sebuah project baru. Bagaimana jika kita bisa membuat hal serupa untuk project kita? Kita bisa, dan Elixir membuat ini mudah untuk kita lakukan.

Setup

Mari setup sebuah aplikasi Mix yang sangat mendasar.

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

Sekarang, dalam file lib/hello.ex yang dibuat Mix untuk kita, mari buat sebuah fungsi sederhana yang akan beri output “Hello, World!”

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

Task Mix Custom

Mari kita buat task Mix custom kita. Buat sebuah direktori baru dan file hello/lib/mix/tasks/hello.ex. Di dalam file ini, mari masukkan 7 baris Elixir berikut.

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

Perhatikan bagaimana kita mengawali pernyataan defmodule kita dengan Mix.Tasks dan nama yang kita ingin panggil dari command line. Pada baris kedua kita memperkenalkan use Mix.Task yang mengambil perilaku (behaviour) Mix.Task ke dalam namespace tersebut. Kita kemudian mendeklarasikan sebuah fungsi run yang mengabaikan segala argumen, semetara ini. Di dalam fungsi ini, kita memanggil modul Hello kita dan fungsi say.

Task Mix Bekerja

Mari kita coba task Mix kita. Selama kita ada di direktori tersebut seharusnya bisa bekerja. Dari command line, jalankan mix hello, dan kita semestinya melihat tampilan seperti berikut:

$ mix hello
Hello, World!

Mix secara default cukup ramah. Mix tahu bahwa semua orang bisa melakukan kesalahan eja, jadi Mix menggunakan teknik yang disebut fuzzy string matching (pencocokan string yang tidak tegas) untuk membuat rekomendasi:

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

Apakah anda juga memperhatikan bahwa kita memperkenalkan sebuah atribut modul baru, @shortdoc? Atribut ini berguna ketika meluncurkan aplikasi kita, seperti ketika seorang user menjalankan perintah mix help dari terminal.

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