elixir官方教程Mix與OTP(一) Mix入門

#Mix入門git

  1. 咱們的第一個項目
  2. 編輯項目
  3. 執行測試
  4. 環境
  5. 探索

在本教程中,咱們將學習如何構建一個完整的Elixir應用,包括監督樹,配置,測試等等.併發

這個應用的功能是分佈式鍵值倉庫.咱們將把鍵值對安排到桶中,並將桶分佈到多個節點.咱們也會構建一個簡單的客戶端,讓咱們可以與其中任何一個節點鏈接併發送以下請求:app

CREATE shopping
OK

PUT shopping milk 1
OK

PUT shopping eggs 3
OK

GET shopping milk
1
OK

DELETE shopping eggs
OK

爲了構建咱們的鍵值應用,咱們會用到三個主要工具:框架

  • OTP(開放通訊平臺)是Erlang裝載的一系列庫.Erlang開發者使用OTP來構建健壯的,容錯的應用.本章咱們將探索Elixir融合了多少來自OTP的內容,包括監督樹,事件管理等等;dom

  • Mix 是Elixir裝載的一個構建工具,提供了建立,編譯,測試應用,管理依賴等等;分佈式

  • ExUnit 是Elixir裝載的一個基本單元測試框架;函數

本章,咱們將使用Mix建立第一個項目,並探索OTP,Mix和ExUnit的不一樣特性.工具

注意:本教程要求Elixir版本v1.2.0或以上.你能夠用elixir -v來檢查版本,若有須要可按入門教程的第一章中的步驟安裝最新的版本.單元測試

如對本教程有任何疑問或改進意見,請經過咱們的郵件列表或問題跟蹤來告訴咱們.你的意見對於幫助咱們確保這份教程可用且最新十分重要!學習

#咱們的第一個項目

當你安裝Elixir時,除了獲得了elixir,elixirciex這些可執行文件外,還獲得了一個可執行的Elixir腳本mix.

讓咱們經過從命令行中調用mix new來建立咱們的第一個項目.咱們會將項目名當作參數傳遞(本例中是kv),並告訴Mix咱們的主模塊是全大寫的KV,而不是默認的Kv:

$ mix new kv --module KV

Mix會建立一個叫kv的目錄,其中有以下文件:

* creating README.md
* creating .gitignore
* creating mix.exs
* creating config
* creating config/config.exs
* creating lib
* creating lib/kv.ex
* creating test
* creating test/test_helper.exs
* creating test/kv_test.exs

讓咱們簡單查看一下這些文件.

注意: Mix是一個Elixir可執行文件.這意味着想要運行mix,你的PATH中須要有Elixir的可執行文件.若是沒有,你能夠將腳本看成參數傳遞給elixir來運行它:

$ bin/elixir bin/mix new kv --module KV

注意你也能夠在PATH中用Elixir加上-S選項來執行任何腳本:

$ bin/elixir -S mix new kv --module KV

當使用-S時,elixir會找到腳本並執行它,不管是否存在與你的PATH中.

#編輯項目

在咱們的新項目目錄(kv)中生成了一個叫mix.exs的文件,它的主要做用是配置咱們的項目.讓咱們來看看(註釋已刪除):

defmodule KV.Mixfile do
  use Mix.Project

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

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

  defp deps do
    []
  end
end

咱們的mix.exs定義了兩個公共函數:project,它會返回諸如項目名稱和版本等項目配置,以及application,它用於生成應用文件.

這裏還有一個叫作deps的私有函數,它被project函數調用,定義了咱們的項目的依賴.將deps做爲一個獨立的函數不是必需的,但這樣作能夠有助於保持項目配置的整潔.

Mix也生成了一個文件lib/kv.ex,其中有一個簡單的模塊定義:

defmodule KV do
end

這個結構體足夠編譯咱們的項目:

$ cd kv
$ mix compile

將輸出:Compiling 1 file (.ex) Generated kv app

lib/kv.ex已被編譯,生成了一個名爲kv.app的應用,而且全部的協議都如入門教程中描述的那樣被鞏固了.全部的編譯成品都如mix.exs中定義的那樣被存放在了_build目錄中.

編譯完成後,你就能夠在項目內開啓一個iex會話,經過運行:

$ iex -S mix

#運行測試

Mix也爲運行咱們的項目測試而生成了合適的結構.一般,Mix項目以方便起見會在lib目錄中的test目錄下爲每一個文件生成一個<filename>_test.exs文件.因此,咱們可以找到一個test/kv_test.exs文件對應着咱們的lib/kv.ex文件.這一點上作的很少:

defmodule KVTest do
  use ExUnit.Case
  doctest KV

  test "the truth" do
    assert 1 + 1 == 2
  end
end

這有幾件事要特別注意的:

  1. 測試文件是一個Elixir腳本文件(.exs).便捷之處在於咱們不須要在運行測試以前編譯它們;

  2. 咱們定義了一個名爲KVTest的模塊,使用ExUnit.Case來注入測試API,並使用test/2宏定義了一個簡單的測試;

Mix也生成了一個叫test/test_helper.exs的文件,它的做用是啓動測試框架:

ExUnit.start()

這個文件會在每次咱們運行測試以前被Mix自動調用.咱們可使用mix test運行測試:

Compiled lib/kv.ex
Generated kv app
[...]
.

Finished in 0.04 seconds (0.04s on load, 0.00s on tests)
1 test, 0 failures

Randomized with seed 540224

注意,經過運行mix test,Mix再一次編譯了源文件並生成應用.這是因爲Mix支持多重環境,咱們將在下一部分探索它.

並且,你能夠看到ExUnit爲每一個成功的測試打印了一個點,而且自動進行了亂序測試.試試讓測試失敗會發生什麼.

test/kv_test.exs中的斷言改爲:

assert 1 + 1 == 3

再次運行mix test(注意此次沒有進行編譯):

1) test the truth (KVTest)
   test/kv_test.exs:5
   Assertion with == failed
   code: 1 + 1 == 3
   lhs:  2
   rhs:  3
   stacktrace:
     test/kv_test.exs:6

Finished in 0.05 seconds (0.05s on load, 0.00s on tests)
1 test, 1 failure

對於每一個失敗,ExUnit都打印了一個詳細的報告,包括測試名稱與測試案例,失敗的代碼和==符號左手邊(lhs)與右手邊(rhs)的值.

在失敗的第二行,測試名以後,是測試定義的位置.若是你複製了第二行(包括文件名與行號)並將其添加到mix test以後,Mix將會只載入和運行這一測試:

$ mix test test/kv_test.exs:5

這個短語在咱們構建項目時很是有用,它讓咱們可以快速地重複某一特定測試.

最後,堆棧跟蹤指向了失敗自己,提供了與測試相關的信息,以及源文件中失敗生成的位置.

#環境

Mix支持"環境"的概念.它們容許開發者爲特定的情景自定義編譯和其它選項.Mix默認接受三種環境:

  • :dev--Mix任務(例如compile)按默認設置運行
  • :test--由mix test使用
  • :prod--在項目產品運行時用到的

環境設置只對當前項目生效.正如咱們將要看到的,任何你添加到項目中的依賴會默認運行在:prod環境.

你能夠經過訪問mix.exs文件中的Mix.env函數來自定義環境,它會以原子形式返回當前環境.這就是咱們在:bulid_embedded:start_permanent選項中所使用的:

def project do
  [...,
   build_embedded: Mix.env == :prod,
   start_permanent: Mix.env == :prod,
   ...]
end

當你編譯源代碼時,Elixir將編譯成果放到額_build目錄中.然而,爲了不沒必要要的複製,Elixir會建立一個從_build到實際源代碼文件的文件系統連接.當:build_embedded爲真時,會中止這個行爲,意在使全部運行應用所需的東西都放在_build中.

類似地,當:start_permanent選項爲真時,你的應用將運行在永久模式,這意味着若是應用的監督樹關閉了,Erlang虛擬機就會崩潰.注意咱們不但願這個行爲出如今dev和test環境中,由於保持Erlang虛擬機運行對於解決問題十分有用.

Mix默認處於:dev環境,只有test任務會默認在:test環境.能夠經過MIX_ENV環境變量來修改環境:

$ MIX_ENV=prod mix compile

在Windows中:

> set "MIX_ENV=prod" && mix compile

#探索

Mix還有不少內容,咱們將在構建項目的過程當中繼續探索它.在Mix文檔中你能獲得一個概述.

記住你總能經過調用幫助任務來列出全部可用任務:

$ mix help

你能夠經過調用mix help TASK來得到有關特定任務的信息.

讓咱們開始寫代碼吧!

相關文章
相關標籤/搜索