檢視原始碼 發行版本

建議您同時閱讀 SASL 中的 relsystoolsscript 相關章節。

發行版本概念

當您編寫了一個或多個應用程式後,您可能希望使用這些應用程式以及 Erlang/OTP 應用程式的子集來建立完整的系統。這被稱為發行版本

要執行此操作,請建立一個發行版本資源檔,該檔案定義了發行版本中包含哪些應用程式。

發行版本資源檔用於產生啟動腳本發行版本套件。傳輸到另一個站點並在那裡安裝的系統稱為目標系統。如何在系統原理中的建立和升級目標系統中描述如何使用發行版本套件建立目標系統。

發行版本資源檔

要定義發行版本,請建立一個發行版本資源檔,簡稱 .rel 檔。在該檔案中,指定發行版本的名稱和版本、它基於哪個 ERTS 版本以及它由哪些應用程式組成。

{release, {Name,Vsn}, {erts, EVsn},
 [{Application1, AppVsn1},
   ...
  {ApplicationN, AppVsnN}]}.

NameVsnEVsnAppVsn 是字串。

該檔案必須命名為 Rel.rel,其中 Rel 是一個唯一名稱。

每個 Application(原子)和 AppVsn 是包含在發行版本中的應用程式的名稱和版本。基於 Erlang/OTP 的最小發行版本由 Kernel 和 STDLIB 應用程式組成,因此這些應用程式必須包含在列表中。

如果要升級發行版本,則它還必須包含 SASL 應用程式。

這是一個範例,顯示了來自應用程式章節的 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 檔案還必須包含 kernelstdlibsasl,因為 ch_app 需要這些應用程式。該檔案名為 ch_rel-1.rel

{release,
 {"ch_rel", "A"},
 {erts, "14.2.5"},
 [{kernel, "9.2.4"},
  {stdlib, "5.2.3"},
  {sasl, "4.2.1"},
  {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_rel-1.boot

  • "ch_rel-1".rel 檔案的名稱,不包含副檔名。
  • local 是一個選項,表示在啟動腳本中使用找到應用程式的目錄,而不是 $ROOT/lib$ROOT 是已安裝發行版本的根目錄)。

這是在本機測試產生的啟動腳本的有用方法。

當使用啟動腳本啟動 Erlang/OTP 時,會自動載入並啟動 .rel 檔案中的所有應用程式。

% erl -boot ch_rel-1
Erlang/OTP 26 [erts-14.2.5] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit]

Eshell V14.2.5 (press Ctrl+G to abort, type help(). for help)
1> application:which_applications().
[{ch_app,"Channel allocator","1"},
 {sasl,"SASL  CXC 138 11","4.2.1"},
 {stdlib,"ERTS  CXC 138 10","5.2.3"},
 {kernel,"ERTS  CXC 138 10","9.2.4"}]

建立發行版本套件

systools:make_tar/1,2 函數會將 .rel 檔案作為輸入,並建立一個包含指定應用程式程式碼的壓縮 tar 檔案,即發行版本套件

1> systools:make_script("ch_rel-1").
ok
2> systools:make_tar("ch_rel-1").
ok

發行版本套件預設包含:

  • .app 檔案
  • .rel 檔案
  • 所有應用程式的物件程式碼,其結構根據應用程式目錄結構排列。
  • 重新命名為 start.boot 的二進制啟動腳本。
% tar tf ch_rel-1.tar
lib/kernel-9.2.4/ebin/kernel.app
lib/kernel-9.2.4/ebin/application.beam
...
lib/stdlib-5.2.3/ebin/stdlib.app
lib/stdlib-5.2.3/ebin/argparse.beam
...
lib/sasl-4.2.1/ebin/sasl.app
lib/sasl-4.2.1/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/ch_rel-1.rel
releases/A/ch_rel-1.rel
releases/A/start.boot

在建立發行版本套件之前,產生了一個新的啟動腳本,但未設定 local 選項。在發行版本套件中,所有應用程式目錄都放置在 lib 下。您不知道發行版本套件將安裝在哪裡,因此不允許使用任何硬式編碼的絕對路徑。

發行版本資源檔 mysystem.rel 在 tar 檔案中重複。最初,此檔案僅儲存在 releases 目錄中,以便 release_handler 可以單獨提取此檔案。解壓縮 tar 檔案後,release_handler 會自動將檔案複製到 releases/FIRST。但是,有時解壓縮 tar 檔案時不會涉及 release_handler(例如,解壓縮第一個目標系統時),因此檔案現在會改為在 tar 檔案中重複,以便不需要手動複製。

如果找到名為 sys.configsys.config.srcrelup 檔案和/或系統組態檔案,這些檔案也會包含在發行版本套件中。請參閱發行版本處理

可以設定選項,使發行版本套件也包含原始碼和 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.configsys.config.src
  • 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 函數時被作為 variables 引入。

無碟和/或唯讀用戶端

如果完整的系統由無碟和/或唯讀用戶端節點組成,則應將 clients 目錄新增至 $ROOT 目錄。唯讀節點是具有唯讀檔案系統的節點。

clients 目錄的每個受支援用戶端節點都要有一個子目錄。每個用戶端目錄的名稱應為對應用戶端節點的名稱。至少,每個用戶端目錄都應包含 binreleases 子目錄。這些目錄用於儲存有關已安裝發行版本的資訊,並指定用戶端的目前發行版本。$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