10.發佈

本章應該與 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
Erlang運行時系統的可執行文件。
releases/Vsn
.rel 文件以及啓動腳本  start.boot 。 還有  relup 、  sys.config ,若是存在於發佈包中。
bin
頂層Erlang運行時系統可執行文件。

應用不必定非得放在 $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 。

相關文章
相關標籤/搜索