本章應該與 rel(4) , systools(3) 和 script(4) 。html
當咱們已經寫了一個或多個應用後,咱們可能想建立一個由這些應用和Erlang/OTP應用的一個子集組成的完整系統。node
要實現這個目的,咱們經過建立一個定義在發佈中要包含哪些應用的 發佈資源文件 。shell
該發佈資源文件是用於生成 啓動腳本 和 發佈包 。傳送並安裝在另一個站點的系統稱之爲 目標系統 。若是使用發佈包建立一個目標系統將在系統原則中描述。app
要定義一個發佈,首先要建立一個 發佈資源文件 ,簡稱 .rel
文件,咱們在這裏指定發佈的名稱和版本、它基於哪一個ERTS版本,以及它由哪些應用組成:函數
{release, {Name,Vsn}, {erts, EVsn}, [{Application1, AppVsn1}, ... {ApplicationN, AppVsnN}]}.
文件必須叫作 Rel.rel
,其中 Rel
是一個惟一名字。工具
Name
, Vsn
和 Evsn
都是字符串。測試
每一個 Application
(原子)和 AppVsn
(字符串)是包含在發佈內的應用的名稱和版本。注意,基於Erlang/OTP的最小發布由應用 kernel
和 stdlib
組成,因此這兩個應用必須被包含在列表中。編碼
例如:咱們要建立一個來自應用一章的 ch_app
的發佈。這個應用包含如下 .app
文件:操作系統
{application, ch_app, [{description, "Channel allocator"}, {vsn, "1"}, {modules, [ch_app, ch_sup, ch3]}, {registered, [ch3]}, {applications, [kernel, stdlib, sasl]}, {mod, {ch_app,[]}} ]}.
.rel
文件還必須包含 kernel
, stdlib
和 sasl
,由於這些應用是 ch_app
必須的。咱們把這個文件叫作 ch_rel-1.rel
:rest
{release, {"ch_rel", "A"}, {erts, "5.3"}, [{kernel, "2.9"}, {stdlib, "1.12"}, {sasl, "1.10"}, {ch_app, "1"}] }.
在SASL模塊 systools
裏面有不少能夠用來構建和檢驗發佈的工具。函數讀取 .rel
和 .app
文件並執行語法和依賴性檢查。函數 systools:make_script/1,2
用於生成啓動腳本(參見系統原則)。
1> systools:make_script("ch_rel-1", [local]). ok
這就建立了一個啓動腳本,包括可閱讀的版本 ch_rel-1.script
和運行時系統所使用的二進制版本 ch_re-1.boot
。 「 ch_rel-1
」是 .rel
文件去掉擴展名的名稱。 local
是表示在啓動腳本中用到的應用所處的目錄的一個選項,沒有使用$ROOT/lib
。( $ROOT
是安裝了的發佈的根目錄)對於本地測試生成的啓動腳本很是有用。
當使用啓動腳本啓動Erlang/OTP時, .rel
文件中的全部應用都會被自動加載和啓動:
% erl -boot ch_rel-1 Erlang (BEAM) emulator version 5.3 Eshell V5.3 (abort with ^G) 1> =PROGRESS REPORT==== 13-Jun-2003::12:01:15 === supervisor: {local,sasl_safe_sup} started: [{pid,<0.33.0>}, {name,alarm_handler}, {mfa,{alarm_handler,start_link,[]}}, {restart_type,permanent}, {shutdown,2000}, {child_type,worker}] ... =PROGRESS REPORT==== 13-Jun-2003::12:01:15 === application: sasl started_at: nonode@nohost ... =PROGRESS REPORT==== 13-Jun-2003::12:01:15 === application: ch_app started_at: nonode@nohost
函數 systools:make_tar/1,2
以一個 .rel
文件做爲輸入,並建立一個包含了指定應用的壓縮tar包,即一個發佈包(release package)。
1> systools:make_script("ch_rel-1"). ok 2> systools:make_tar("ch_rel-1"). ok
默認的發佈包包含了全部的應用的 .app
文件和目標代碼,並根據 應用目錄結構 創建結構,同時將二進制的啓動腳本改名爲 start.boot
,還包含了 .rel
文件。
% tar tf ch_rel-1.tar lib/kernel-2.9/ebin/kernel.app lib/kernel-2.9/ebin/application.beam ... lib/stdlib-1.12/ebin/stdlib.app lib/stdlib-1.12/ebin/beam_lib.beam ... lib/sasl-1.10/ebin/sasl.app lib/sasl-1.10/ebin/sasl.beam ... lib/ch_app-1/ebin/ch_app.app lib/ch_app-1/ebin/ch_app.beam lib/ch_app-1/ebin/ch_sup.beam lib/ch_app-1/ebin/ch3.beam releases/A/start.boot releases/ch_rel-1.rel
注意在製做發佈包以前,生成新的啓動腳本沒有設置 local
選項。在發佈包中,全部的應用目錄都放在了 lib
。同時,咱們不知道發佈包會被安裝到何處,因此咱們不想在啓動腳本中硬編碼任何絕對路徑。
若是有一個 relup
文件以及/或叫作 sys.config
系統配置文件,這些文件也會被包含在發佈包。參見 發佈處理 :
也能夠設置參數讓發佈包包含代碼和ERTS二進制文件。
如何使用發佈包安裝首個目標系統,請參考系統原理。若是在已存在系統的安裝新的發佈包,請參考 發佈處理 。
發佈處理器從發佈包總安裝的代碼的目錄結構:
$ROOT/lib/App1-AVsn1/ebin /priv /App2-AVsn2/ebin /priv ... /AppN-AVsnN/ebin /priv /erts-EVsn/bin /releases/Vsn /bin
lib
erts-EVsn/bin
releases/Vsn
.rel
文件以及啓動腳本
start.boot
。 還有
relup
、
sys.config
,若是存在於發佈包中。
bin
應用不必定非得放在 $ROOT/lib
目錄中。這樣一來,一些安裝目錄能夠存在幷包含一個系統的不一樣部分。例如,前面的例子能夠按以下方式擴展:
$SECOND_ROOT/.../SApp1-SAVsn1/ebin /priv /SApp2-SAVsn2/ebin /priv ... /SAppN-SAVsnN/ebin /priv $THIRD_ROOT/TApp1-TAVsn1/ebin /priv /TApp2-TAVsn2/ebin /priv ... /TAppN-TAVsnN/ebin /priv
其中 $SECOND_ROOT
和 $THIRD_ROOT
是做爲調用 systools:make_script/2
函數中的變量引入的。
若是一個完整的系統包含一些無盤和只讀客戶端節點,那麼必須在 $ROOT
目錄中添加一個 clients
目錄。一個只讀節點的意思是一個節點的文件系統是隻讀的。
clients
目錄還應該對每一個支持的客戶端節點有一個對應的子目錄。每一個客戶端目錄的名字必須是對應的客戶端節點的名字。每一個客戶端目錄還應包含 bin
和 releases
子目錄。這些目錄用於存放有關安裝的發佈的信息,而且給客戶端指派當前的發佈。終上所述, $ROOT
目錄應包含如下內容:
$ROOT/... /clients/ClientName1/bin /releases/Vsn /ClientName2/bin /releases/Vsn ... /ClientNameN/bin /releases/Vsn
若是全部的客戶端都運行在同一種類型的Erlang機器上,那麼應該使用這種結構。若是有些客戶端運行不一樣類型的Erlang機器,即運行在不一樣的操做系統上,那麼 clients
目錄能夠被劃分爲每種Erlang機器一個子目錄。或者,你也能夠爲每種類型的機器設置一個 $ROOT
。對於每種類型,還應包含爲 $ROOT
指定的某些目錄:
$ROOT/... /clients/Type1/lib /erts-EVsn /bin /ClientName1/bin /releases/Vsn /ClientName2/bin /releases/Vsn ... /ClientNameN/bin /releases/Vsn ... /TypeN/lib /erts-EVsn /bin ...
對於這個結構, Type1
型的客戶端的根目錄是 $ROOT/clients/Type1
。