本文基本都是按照rebar3官方文檔翻譯加上自己的理解整理而成,可能有紕漏,疑惑部分請查看原文訂正。
安裝
- 使用源碼安裝
$ git clone https://github.com/erlang/rebar3.git
$ cd rebar3
$ ./bootstrap
- 直接下載編譯好的二進制文件
$ wget https://s3.amazonaws.com/rebar3/rebar3 && chmod +x rebar3
如果要在windows下使用的話,需要額外製作一個rebar3.bat用來調用
@echo off
setlocal
set rebarscript=%~f0
escript.exe "%rebarscript:.cmd=%" %*
當然要求erlang環境,escript必須在path中,如果用過rebar,和以前的rebar.bat作用是一樣的,不過現在IDEA的erlang插件已經支持了,如果使用IDEA就不用通過腳本調用
加入到環境變量中
./rebar3 local install
後續更新,可以通過命令直接更新到最新穩定版本
rebar3 local upgrade
基礎用法
- 創建一個新的app或者release
- 加入deps依賴
- 編譯
- 輸出配置
- 測試
- 發佈
創建一個新的app或者release
rebar3推薦兩種主流方式管理項目:單個app結構的管理或者傘狀管理
單個app方式是根目錄中只有一個app,源代碼存放在src目錄,這種格式主要用來做庫,處於共享的目的,例如recon,雖然一般把這種目錄方式認爲成一個庫項目,但是這種結構還是可以發佈
傘狀項目的特點是包含了多個獨立的OTP app,通常位於apps/ 或者 lib/目錄中,這些app都可以有自己的rebar.config這種格式一般用於項目開發,項目可以擁有一個或多個主app,不一定只能有一個
rebar3提供了命令用來新建任意類型的模板,可通過rebar3 new <template> <project-name>
命令調用。該<template>
值可以是下面的任意值:
- app: 具有監督樹和state維護的一個OTP application,作爲一個單獨的app
- lib: 沒有監督樹的OTP application,一般用來將多個模塊組合起來作爲一個單獨的項目
- release: 準備發佈的傘狀項目,比app項目多了config目錄下的sys.config,和vm.args,用來描述運行環境
- escript: 一種基於app的項目,將來可以構建成escript腳本
- plugin: 用於支持rebar3腳本
加入deps依賴
{deps, [
{cowboy, "1.0.1"}, % package
{cowboy, {git, "git://github.com/ninenines/cowboy.git", {tag, "1.0.1"}}} % alternatively, source
]
}.
上面兩種方式都可以獲取依賴,對於第二種,使用過rebar的同學應該很熟悉,變化並不大
對於第一種,是用hex管理的erlang庫完成的歸類,例如上面的cowboy,最後就是通過https://repo.hex.pm/tarballs/cowboy-1.0.1.tar
這種地址從已經歸類的服務端進行下載後管理的,至於hex的用法,比較複雜。如果想了解可以點這裏。
總的來說,一般比較常用的庫hex都會有歸檔,不需要提供git倉庫地址,但是如果不配置就沒法完成的話,就得按照第二種格式配置上vsn地址了。當然也可以通過更新hex的歸檔目錄實現,不過吧,我只是猜可以,沒實踐過。。
rebar的老配置格式,例如
{cowboy, ".*", {git, "git://github.com/ninenines/cowboy.git", {tag, "1.0.1"}}}
這種在rebar3也是兼容的,但是第二個字段".*",會被忽略
添加完deps目錄後,記得將新加的application加入到你的主app的.app.src文件中,這樣就不用手動額外進行application調用了
編譯
和rebar一樣,在項目的根目錄下執行rebar compile
就可以完成編譯,不過和rebar不同的是,使用rebar我們得先執行rebar get-deps
先主動獲取依賴才行,rebar3不需要直接執行compile即可,而且可以保證deps目錄是最新的,即使deps庫有了變更。
輸出配置
默認的輸入目錄爲_build目錄,和rebar不同
- _build
- default
- lib
- cowboy
- cowlib
- ranch
- lib
- default
測試
測試用例默認是存放在test/目錄下,eunit允許按照模塊組織打包目錄存放
如果測試用例需要額外的依賴,可以做單獨配置,只有在運行測試用例的時候才getdeps指定依賴
{profiles, [
{test, [
{deps, [
{meck, {git, "git://github.com/eproxus/meck.git", {tag, "0.8.2"}}}
]}
]}
]}.
現在第一次調用rebar3 ct
會更新meck到_build/test/lib/.下,但是不會被加到rebar.lock文件中
發佈
rebar3使用relx進行構建
可以使用rebar3 new release myrel
直接新建一個發佈目標,該項目的rebar.config就會有一個推薦的relx配置如下
{relx, [{release, {myrel, "0.0.1"},
[myrel]},
{dev_mode, true},
{include_erts, false},
{extended_start_script, true}
]
}.
{profiles, [
{prod, [{relx, [{dev_mode, false},
{include_erts, true}]}
]}
]}.
你可以將上面的內容複製到你的rebar.config中,當然記得將myrel該成你自己的項目,就可以調用rebar3 release
進行發佈
由於默認配置dev_mode爲true,那麼_build/rel/myrel/lib是符號連接_build/lib和apps/myrel。因此,在開發和重新編譯應用程序時,您無需重新創建發行版,只需重新啓動節點或重新加載模塊即可。
使用命令rebar3 as prod tar
可以將發佈的文件打包成tar包方便拷貝