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

Mix

Trước khi đi sâu vào Elixir thì chúng ta cần tìm hiều về mix đầu tiên. Nếu bạn đã quen thuộc với Ruby thì mix tương ứng với Bundler, Rubygems và Rake hợp lại. Mix là một phần quan trọng trong bất cứ dự án Elixir nào và trong bài này chúng ta sẽ đi vào một vài tính năng thú vị của nó. Để xem mix có tất cả những chức năng gì thì chúng ta chạy mix help.

Tính cho đến thời điểm hiện tại thì chúng ta làm việc hoàn toàn bên trong iex, tuy nhiên việc đó có rất nhiều hạn chế. Để tạo được một dự án có ý nghĩa hơn thì chúng ta cần chia code ra thành nhiều file cho dễ quản lý, và mix giúp chúng ta làm việc đó với chức năng projects

Tạo Projects

Khi chúng ta tạo một dự án Elixir mới, mix khiến việc đó trở nên vô cùng dễ dàng với câu lệnh mix new. Câu lệnh đó sẽ tạo ra cấu trúc thư mục project và những gì cần thiết ban đầu. Việc này khá dễ hiểu, vậy hãy bắt đầu thôi:

mix new example

Từ output chúng ta có thể thấy mix đã tạo ra thư mục mới và rất nhiều file khởi tạo:

* creating README.md
* creating .gitignore
* creating .formatter.exs
* creating mix.exs
* creating lib
* creating lib/example.ex
* creating test
* creating test/test_helper.exs
* creating test/example_test.exs

Trong bài này chúng ta tập trung vào file mix.exs. Ở đây chúng ta có thể thay đổi cấu hình của chương trình của chúng ta, các phụ thuộc, biến môi trường, version. Mở file đó ra bằng editor yêu thích của bạn, bạn sẽ thấy như dưới đây:

defmodule Example.Mix do
  use Mix.Project

  def project do
    [
      app: :example,
      version: "0.1.0",
      elixir: "~> 1.5",
      start_permanent: Mix.env() == :prod,
      deps: deps()
    ]
  end

  def application do
    [
      extra_applications: [:logger]
    ]
  end

  defp deps do
    []
  end
end

Đầu tiên chúng ta hãy nhìn vào phần project. Tại đây chúng ta định nghĩa tên của ứng (app), chỉ định phiên (version), phiên bản Elixir (elixir), và cuối cùng là thư viện phụ thuộc của dự án (deps).

Phần application được sử dụng xuyên suốt các phần tiếp theo mà chúng ta sẽ sinh ra các file cho dự án.

Biên dịch

Mix rất thông minh và sẽ biên dịch phần thay đổi của dự án khi cần thiết, tuy nhiên đôi khi chúng ta cũng cần chỉ định biên dịch một cách rõ ràng (explicitly). Ở phần này chúng ta sẽ đi vào việc biên dịch dự án của bạn và những gì được thực hiện trong quá trình biên dịch đó.

Để biên dịch một dự án mix, chúng ta sẽ cần chạy mix compile tại thư mục gốc:

mix compile

Dự án hiện tại của chúng ta không có quá nhiều thứ, vậy nên những gì được output ra cũng không quá thú vị, tuy nhiên chắc chắn là việc biên dịch sẽ diễn ra suôn sẻ:

Compiled lib/example.ex
Generated example app

Khi chúng ta biên dịch, mix sẽ tạo một thư mục _build cho thành quả biên dịch. Nếu nhìn vào bên trong _build chúng ta sẽ thấy application của chúng ta đã được biện dịch dưới dạng example.app.

Tương tác

Sử dụng iex bên trong ngữ cảnh của chương trình của chúng ta có thể sẽ cần thiết. Rất may mắn là mix đã làm cho việc này trở nên vô cùng dễ dàng. Sau khi application đã được biên dịch, chúng ta có thể tạo một iex session mới:

cd example
iex -S mix

Khởi tạo iex theo cách này sẽ tải chương trình và toàn bộ phụ thuộc vào runtime hiện tại.

Quản lý phụ thuộc

Dự án của chúng ta hiện tại chưa có phụ thuộc nào, nhưng ngay sau đây chúng ta sẽ tiến tiếp và định nghĩa phụ thuộc, cũng như tải chúng về.

Để tạo phụ thuộc mới, điều đầu tiên cần làm là thêm vào file mix.exs, phần deps. Danh sách phụ thuộc sẽ là một danh sách các tuples với hai biến cần thiết, và 1 biến tuỳ ý: Tên của package dưới dạng atom, chuỗi kí tự version, và các lựa chọn tuỳ ý.

Trong ví dụ này hãy xem một dự án với các phụ thuộc như là phoenix_slim:

def deps do
  [{:phoenix, "~> 1.1 or ~> 1.2"},
   {:phoenix_html, "~> 2.3"},
   {:cowboy, "~> 1.0", only: [:dev, :test]},
   {:slime, "~> 0.14"}]
end

Chúng ta có thể nhận thấy trong ví dụ về phụ thuộc ở trên, phụ thuộc cowboy chỉ cần thiết trong quá trình phát triển cũng như test.

Sau khi đã định nghĩa danh sách phụ thuộc xong, việc cuối cùng chính là tải chúng về. Quá trình này cũng tương tự như bundle install trong ruby:

mix deps.get

Vậy đó! Chúng ta đã định nghĩa và tải về phụ thuộc của dự án. Như vậy từ nay về sau chúng ta có thể thêm các phụ thuộc vào bất kì khi nào cần thiết.

Môi trường

Mix, cũng như bundler hỗ trợ nhiều môi trường khác nhau. Ở trạng thái ban đầu thì mix hỗ trợ ba loại môi trường:

Môi trường hiện tại có thể được truy cập sử dụng Mix.env. Và không nằm ngoài dự đoán, môi trường cũng có thể được thay đổi thông qua biến môi trường MIX_ENV.

MIX_ENV=prod mix compile
Caught a mistake or want to contribute to the lesson? Edit this lesson on GitHub!