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

Ειδικές Εργασίες Mix

Δημιουργία ειδικών εργασιών Mix για τα Elixir projects σας.

Εισαγωγή

Είναι συνηθισμένο να θέλετε να επεκτείνετε τη λειτουργικότητα των εφαρμογών σας στην Elixir προσθέτοντας ειδικές εργασίες Mix. Πριν μάθουμε πως να το κάνουμε αυτό, ας δούμε ένα που υπάρχει ήδη:

$ 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 για να δημιουργεί ένα νέο project. Θα μπορούσαμε να δημιουργήσουμε κάτι παρόμοιο για τo project μας; Μπορούμε, και η Elixir το κάνει πολύ έυκολο για εμάς.

Εγκατάσταση

Ας εγκαταστήσουμε μια πολύ βασική εφαρμογή Mix.

$ mix new hello

* creating README.md
* creating .formatter.exs
* 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.

Τώρα, στο αρχείο lib/hello.ex που μας έφτιαξε το το Mix, ας δημιουργήσουμε μια απλή συνάρτηση που εμφανίζει το “Γειά σου, Κόσμε!”

defmodule Hello do
  @doc """
  Outputs "Γειά σου, Κόσμε!" every time.
  """
  def say do
    IO.puts("Γειά σου, Κόσμε!")
  end
end

Ειδική Εργασία Mix

Ας δημιουργήσουμε την ειδική εργασία Mix. Δημιουργήστε ένα νέο φάκελο και ένα αρχείο μέσα σε αυτόν: 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 calls the Hello.say/0 function."
  def run(_) do
    # καλεί την συνάρτηση μας Hello.say() από πριν
    Hello.say()
  end
end

Παρατηρείστε πως ξεκινούμε την δήλωση defmodule με το Mix.Tasks και το όνομα που θέλουμε να καλέσουμε από τη γραμμή εντολών. Στη δεύτερη γραμμή παρουσιάζουμε την use Mix.Task η οποία φέρνει τη συμπεριφορά της Mix.Task στο namespace. Μετά ορίζουμε μια συνάρτηση run η οποία αγνοεί όλα τα ορίσματα για τώρα. Μέσα στη συνάρτηση, καλούμε την ενότητα μας Hello και τη συνάρτηση say.

Φόρτωση της εφαρμογής

Το Mix δεν ξεκινά αυτόματα την εφαρμογή μας ούτε κάποια απο τις εξαρτήσεις της, το οποίο δεν είναι πρόβλημα για αρκετές περιπτώσεις χρήσης της εργασίας Mix, τι συμβαίνει όμως αν θέλουμε να χρησιμοποιήσουμε το Ecto και να αλληλεπιδράσουμε με μια βάση δεδομένων; Σε αυτή την περίπτωση πρέπει να βεβαιωθούμε ότι η εφαρμογή του Ecto.Repo έχει εκκινηθεί. Υπάρχουν 2 τρόποι για να το χειριστούμε: ξεκινώντας ρητά μια εφαρμογή ή ξεκινώντας την εφαρμογή μας η οποία με την σειρά της θα εκκινήσει τις υπόλοιπες.

Ας δούμε πως μπορούμε να ενημερώσουμε το Mix task, ώστε να ξεκινά την εφαρμογή και τις εξαρτήσεις μας:

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

  @shortdoc "Simply calls the Hello.say/0 function."
  def run(_) do
    # This will start our application
    Mix.Task.run("app.start")

    Hello.say()
  end
end

Εργασίες Mix εν Δράσει

Ας ελέγξουυμε την εργασία mix. Όσο είμαστε στο φάκελο θα πρέπει να δουλεύει. Από τη γραμμή εντολών, τρέξτε την εντολή mix hello, και θα πρέπει να δούμε τα ακόλουθα:

$ mix hello
Γειά σου, Κόσμε!

Το Mix είναι αρκετά φιλικό. Γνωρίζει ότι όλοι μπορούν να κάνουν λάθος στην ορθογραφία μερικές φορές, έτσι χρησιμοποιεί μια τεχνική που λέγεται ασαφής αντιπαραβολή αλφαριθμητικών για να κάνει συστάσεις:

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

Μήπως παρατηρήσατε ήδη ότι εισάγαμε μια νέα ιδιότητα ενότητας, την @shortdoc; Αυτή είναι βολική όταν στέλνουμε την εφαρμογή στην παραγωγή, ώστε για παράδειγμα ο χρήστης να μπορεί να τρέξει την εντολή mix help στο τερματικό.

$ mix help

mix app.start         # Ξεκινάει όλες τις εγγεγραμμένες εφαρμογές
...
mix hello             # Απλά καλεί την συνάρτηση Hello.say/0.
...

Σημείωση: Ο κώδικάς μας πρέπει να έχει συνταχθεί πριν εμφανιστούν οι νέες εργασίες στην έξοδο της εντολής mix help. Μπορούμε να το κάνουμε αυτό είτε τρέχοντας την εντολή mix compile απευθείας, ή τρέχοντας την νέα μας εργασία με την εντολή mix hello, το οποίο θα δώσει το έναυσμα για τη σύνταξη του κώδικα.

Είναι σημαντικό να σημειώσουμε ότι τα ονόματα των εργασιών προέρχονται από το όνομα της ενότητας, οπότε το Mix.Tasks.MyHelper.Utility θα γίνει my_helper.utility.

Έπιασες λάθος ή θέλεις να συνεισφέρεις στο μάθημα; Επεξεργαστείτε αυτό το μάθημα στο GitHub!