#Mix入門git
在本教程中,咱們將學習如何構建一個完整的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
,elixirc
和iex
這些可執行文件外,還獲得了一個可執行的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
這有幾件事要特別注意的:
測試文件是一個Elixir腳本文件(.exs
).便捷之處在於咱們不須要在運行測試以前編譯它們;
咱們定義了一個名爲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
來得到有關特定任務的信息.
讓咱們開始寫代碼吧!