rebar是一個遵循 Erlang/OTP 原則的 Erlang 項目構建工具,使用它可以減少構建標准 Erlang/OTP 項目架構配置的工作量,並且可以很容易的編譯、測試、發布 Erlang 應用程序。更強大的是,rebar 提供一種依賴管理機制,它可以使開發者很方便地通過 Git、Hg 等方式重用常見的第三方 Erlang 模塊或庫。
安裝rebar
你可以在 https://github.com/rebar/rebar里下載zip包或者源代碼自己編譯。
在根目錄下有一個文件bootstrap.bat。執行,你會生成兩個文件rebar.cmd和rebar 這兩個文件,在以后的項目開發中要用到。(bat文件執行,雙擊或者在cmd下執行都可以,最好有administrator權限。)
或者你可以把這兩個文件Copy到你系統變量能夠訪問到的地方,或者把你生成的路徑添加到你自己的系統變量中去。這樣你就可以在任何地方使用rebar命令了。
用Rebar構建項目
首先你要創建一個你的工作目錄。然后把剛才生成的兩個文件Copy到你的工作目錄下面,或者如果你已經添加了系統變量,則不需要。
我們這里建立一個工作路徑D:\myapp,然后執行下面的命令來創建一個Erlang項目,項目的名稱叫做myapp
rebar create-app appid=myapp
這條命令會創建一個src文件夾,並在下面生成3個文件:
- myapp.app.src 應用的資源描述文件,影響后面編譯生成的 rebarapp.app 里的內容
- myapp_app.erl 應用的 Application Behaviour 代碼文件
- myapp_sup.erl 應用的 Supervisor Behaviour 代碼文件
同時rebar還內置了OPT相關的其它文檔魔板,你可以自動生成相應的框架代碼:
- rebar create template=simplesrv srvid=myapp_server
- rebar create template=simplefsm fsmid=myapp_fsm
- rebar create template=simpleapp appid=myapp_app
執行完之后則會在src目錄下生成對應魔板的文件。這里gen_server對應simplesrv,gen_fsm對應simplefsm,application對應simpleapp,相應的魔板ID分別是srvid,fsmid,appid。
用rebar編譯項目
你可以用下面的命令來編譯整個項目:
rebar compile
編譯完成之后,會生成一個ebin文件夾,里面存放了應用的資源文件myapp.app和對應beam文件。
rebar clean 可以用來清理編譯玩的項目
rebar doc 可以用這個命令來生成對應的doc文檔,會生成一個doc的文件夾,打開里面的index.html就可以看到所有的模塊的API描述,當然你必須要符合Edoc的描述格式。具體可以參照這里:http://www.erlang.org/doc/apps/edoc/chapter.html
用rebar配合eunit測試項目
在rebar文件夾下有個rebar.config文件,可以在這里配置eunit選項來進行測試。首先我們把rebar.config拷貝到我們的項目目錄里。然后更改rebar.config文件的內容成下面:
%%-*- mode: erlang -*-
%% Erlang compiler options
{erl_opts, [debug_info,
{i, "test"},
{src_dirs, ["src"]}]}.
{eunit_opts, [verbose, {report, {eunit_surefire, [{dir, "."}]}}]}.
{cover_enabled, true}.
上面的配置會加載test文件下的測試文件,所以我們需要自己建立一個test文件夾。
然后要生成相應的測試用例文件。首先我們建立一個文件myapp_test.hrl的測試用例文件,內容如下
-include_lib("eunit/include/eunit.hrl").
my_test() ->
?assert(1 + 2 =:= 3).
simple_test() ->
ok = application:start(myapp),
?assertNot(undefined =:= whereis(myapp_sup)).
然后在myapp_server.erl文件的末尾加上下面的代碼:
-ifdef(TEST).
-include("myapp_test.hrl").
-endif.
如果有必要你需要在每個模塊的文件最后都加上上面的代碼,然后執行下面的命令來進行eunit測試:
Rebar compile eunit
如果沒有什么問題的話,你應該能看到下面的信息,會告訴你eunit測試情況:
======================== EUnit ========================
module 'rebarapp_server'
rebarapp_server: my_test...ok
rebarapp_server: simple_test...[0.015 s] ok
[done in 0.047 s]
module 'myfsm'
module 'myapp_sup'
module 'myapp_app'
=======================================================
All 2 tests passed.
Cover analysis: d:/Mongodb/projects/.eunit/index.html
這樣你就可以打開.eunit/index.html來查看測試結果。
用rebar來發布應用
如果要發布一個應用,我們需要在應用目錄下,創建一個名為rel的文件夾,用來作為發布用的文件夾。然后我們進入到新建的rel文件夾下面,用下面的命令來創建一個名為myapp的獨立的Erlang VM節點:
rebar create-node nodeid=myapp
修改rel/reltools.config里的lib_dirs的值,默認這里是一個空的列表,改成應用所在的目錄結構"[../../]"。
然后應用的根目錄下面,在rebar.config里加上一行,把新建的rel文件夾放入到rebar可以訪問的子文件夾里,作為應用內容的發布文件夾:
{sub_dirs, ["rel"]}
然后需要編譯一下項目:
rebar compile
如果沒有什么錯誤,那么就可以進行發布了:
rebar generate
如果在終端上沒有發現任何錯誤的話,那么就證明發布成功了。我們就可以來執行和測試我們的發布內容了。我們會發現在發布文件夾下,生成了一堆文件,在rel\myapp\bin 下面生成了一系列的bat文件,用來控制和操作應用的狀況,用法如下:
myapp [install|uninstall|start|stop|restart|console|ping|query|attach|upgrade]
myapp install:會安裝一個service到本地服務里,這樣你電腦啟動的時候這個節點就已經能夠執行了。
myapp uninstall:卸載這個服務
myapp start:啟動服務 stop:停止服務 restart:重啟服務
myapp console:用來啟動一個Erlang Shell來執行這個節點
后面幾個還沒用,等用過了,我再來補充這里的內容。
其它平台使用rebar
其它平台使用rebar,其實命令都是一樣的,只是在安裝的時候有一點點不一樣,還有就是可執行程序不一樣而已。大家有興趣可以自己試驗一下。
