檢視原始碼 發行版本
建議您同時閱讀 SASL 中的 rel
、systools
和 script
相關章節。
發行版本概念
當您編寫了一個或多個應用程式後,您可能希望使用這些應用程式以及 Erlang/OTP 應用程式的子集來建立完整的系統。這被稱為發行版本。
要執行此操作,請建立一個發行版本資源檔,該檔案定義了發行版本中包含哪些應用程式。
發行版本資源檔用於產生啟動腳本和發行版本套件。傳輸到另一個站點並在那裡安裝的系統稱為目標系統。如何在系統原理中的建立和升級目標系統中描述如何使用發行版本套件建立目標系統。
發行版本資源檔
要定義發行版本,請建立一個發行版本資源檔,簡稱 .rel
檔。在該檔案中,指定發行版本的名稱和版本、它基於哪個 ERTS 版本以及它由哪些應用程式組成。
{release, {Name,Vsn}, {erts, EVsn},
[{Application1, AppVsn1},
...
{ApplicationN, AppVsnN}]}.
Name
、Vsn
、EVsn
和 AppVsn
是字串。
該檔案必須命名為 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
檔案還必須包含 kernel
、stdlib
和 sasl
,因為 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.config
或 sys.config.src
的 relup
檔案和/或系統組態檔案,這些檔案也會包含在發行版本套件中。請參閱發行版本處理。
可以設定選項,使發行版本套件也包含原始碼和 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
或sys.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
目錄的每個受支援用戶端節點都要有一個子目錄。每個用戶端目錄的名稱應為對應用戶端節點的名稱。至少,每個用戶端目錄都應包含 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
。