檢視原始碼 systools (sasl v4.2.2)
一套版本處理工具
此模組包含生成啟動腳本(.boot
、.script
)、版本升級檔案(relup
)和版本套件的函數。
另請參閱
app(4)
、appup(4)
、erl(1)
、rel(4)
、release_handler
、relup(4)
、script(4)
摘要
函數
產生一個版本升級檔案 relup
,其中包含從一個或多個先前版本升級或降級的指令。
產生一個啟動腳本 Name.script
及其二進位版本,即啟動檔案 Name.boot
,除非給定了 {script_name, ScriptName}
選項,在這種情況下,名稱為 ScriptName.script
和 ScriptName.boot
。
建立一個版本套件檔案 Name.tar.gz
。
此函數將 File.script
啟動腳本轉換為二進位術語,並將其儲存在 File.boot
檔案中。
函數
-spec make_relup(Name, UpFrom, DownTo) -> Result when Name :: string(), UpFrom :: [Name | {Name, Descr}], DownTo :: [Name | {Name, Descr}], Descr :: term(), Result :: ok | error | {ok, Relup :: term(), Module, Warnings} | {error, Module, Error}, Module :: atom(), Warnings :: term(), Error :: term().
-spec make_relup(Name, UpFrom, DownTo, [Opt]) -> Result when Name :: string(), UpFrom :: [Name | {Name, Descr}], DownTo :: [Name | {Name, Descr}], Descr :: term(), Opt :: {path, [Dir]} | restart_emulator | silent | noexec | {outdir, Dir} | warnings_as_errors, Dir :: string(), Result :: ok | error | {ok, Relup :: term(), Module, Warnings} | {error, Module, Error}, Module :: atom(), Warnings :: term(), Error :: term().
產生一個版本升級檔案 relup
,其中包含從一個或多個先前版本升級或降級的指令。
當在執行時安裝新版本的發行版時,release_handler
會使用這些指令。
預設情況下,relup
檔案位於目前的工作目錄中。如果指定選項 {outdir,Dir}
,則 relup
檔案將位於 Dir
目錄中。
版本資源檔案 Name.rel
會與 UpFrom
和 DownTo
中指定的所有版本資源檔案 Name2.rel
進行比較。對於每個這樣的配對,會推導出以下內容
- 要刪除哪些應用程式,即列在
Name.rel
中但未列在Name2.rel
中的應用程式 - 要新增哪些應用程式,即列在
Name2.rel
中但未列在Name.rel
中的應用程式 - 要升級/降級哪些應用程式,即列在
Name.rel
和Name2.rel
中但版本不同的應用程式 - 如果模擬器在升級或降級後需要重新啟動,即如果
Name.rel
和Name2.rel
之間的 ERTS 版本不同
此指令會依上述順序新增至 relup
檔案。從相關的應用程式升級檔案 App.appup
中擷取應用程式版本之間升級或降級的指令,排序方式與產生啟動腳本時相同,請參閱 make_script/1,2
。高階指令會轉換為低階指令,結果會列印到 relup
檔案。
可選的 Descr
參數會「按原樣」包含在 relup
檔案中,請參閱 relup(4)
。預設值為空列表。
所有檔案都會在程式碼路徑中搜尋。假設應用程式的 .app
和 .appup
檔案位於相同的目錄中。
如果指定選項 {path,[Dir]}
,則此路徑會附加到目前的路徑。萬用字元 *
會展開為所有相符的目錄,例如 lib/*/ebin
。
如果指定選項 restart_emulator
,則會在 relup
檔案中附加一個重新啟動模擬器的低階指令。這可確保在升級或降級系統時完成系統的完整重新開機。
如果升級包含從早於 OTP R15 的模擬器變更為 OTP R15 或更高版本,則會發出警告 pre_R15_emulator_upgrade
。如需更多相關資訊,請參閱系統文件中的設計原則。
預設情況下,錯誤和警告會列印到 tty,且函數會傳回 ok
或 error
。如果指定選項 silent
,則函數會改為傳回 {ok,Relup,Module,Warnings}
,其中 Relup
是版本升級檔案,或 {error,Module,Error}
。可以透過呼叫 Module:format_warning(Warnings)
或 Module:format_error(Error)
將警告和錯誤轉換為字串。
如果指定選項 noexec
,則函數會傳回與 silent
相同的值,但不會建立任何 relup
檔案。
如果指定選項 warnings_as_errors
,則警告會被視為錯誤。
-spec make_script(Name) -> Result when Name :: string(), Result :: ok | error | {ok, Module, Warnings} | {error, Module, Error}, Module :: atom(), Warnings :: term(), Error :: term().
等同於 make_script/2
。
-spec make_script(Name, [Opt]) -> Result when Name :: string(), Opt :: src_tests | {path, [Dir]} | local | {variables, [Var]} | exref | {exref, [App]} | silent | {outdir, Dir} | no_dot_erlang | no_warn_sasl | warnings_as_errors | {script_name, Name}, Dir :: string(), Var :: {VarName, Prefix}, VarName :: string(), Prefix :: string(), App :: atom(), Result :: ok | error | {ok, Module, Warnings} | {error, Module, Error}, Module :: atom(), Warnings :: term(), Error :: term().
產生一個啟動腳本 Name.script
及其二進位版本,即啟動檔案 Name.boot
,除非給定了 {script_name, ScriptName}
選項,在這種情況下,名稱為 ScriptName.script
和 ScriptName.boot
。
啟動檔案指定在 Erlang 執行階段系統啟動時要載入的程式碼和要啟動的應用程式。請參閱 script(4)
。
會讀取版本資源檔案 Name.rel
以確定版本中包含哪些應用程式。然後,會讀取相關的應用程式資源檔案 App.app
以確定要載入哪些模組,以及要如何啟動應用程式。(索引鍵 modules
和 mod
,請參閱 app(4)
。
預設情況下,啟動腳本和啟動檔案位於與 Name.rel
相同的目錄中。也就是說,在目前的工作目錄中,除非 Name
包含路徑。如果指定選項 {outdir,Dir}
,則它們會位於 Dir
中。
會檢查每個應用程式的正確性如下
- 在
.rel
檔案中指定的應用程式版本必須與在.app
檔案中指定的版本相同。 - 不得有未定義的應用程式,也就是與未包含在版本中的應用程式的相依性。(
.app
檔案中的索引鍵applications
)。 - 應用程式之間不得有循環相依性。
- 不得有重複的模組,也就是名稱相同但屬於不同應用程式的模組。
- 如果指定選項
src_tests
,如果模組的原始程式碼遺失或比物件程式碼新,則會發出警告。
應用程式會根據應用程式之間的相依性排序。如果沒有相依性,則會保留 .rel
檔案中的順序。
如果強制應用程式 Kernel 和 STDLIB 未包含在 .rel
檔案中,且啟動類型為 permanent
(預設值),則函數會失敗。
如果 SASL 未作為應用程式包含在 .rel
檔案中,則會發出警告,因為此版本無法在升級中使用。若要關閉此警告,請新增選項 no_warn_sasl
。
所有檔案都會在目前路徑中搜尋。假設應用程式的 .app
和 .beam
檔案位於相同的目錄中。也假設 .erl
檔案位於此目錄中,除非它是 ebin
目錄,在這種情況下,它們可以位於對應的 src
目錄中。
如果指定選項 {path,[Dir]}
,則此路徑會附加到目前的路徑。可以使用萬用字元 *
指定路徑中的目錄,這會展開為所有相符的目錄。範例:"lib/*/ebin"
。
在產生的啟動腳本中,所有應用程式目錄的結構都為 App-Vsn/ebin
。假設它們位於 $ROOT/lib
中,其中 $ROOT
是已安裝版本的根目錄。如果指定選項 local
,則會改為使用找到應用程式的實際目錄。這是本機測試產生之啟動腳本的實用方法。
選項 variables
可用於指定某些應用程式的安裝目錄,而不是 $ROOT/lib
。如果指定變數 {VarName,Prefix}
且應用程式在目錄 Prefix/Rest/App[-Vsn]/ebin
中找到,則此應用程式在啟動腳本中會取得路徑 VarName/Rest/App-Vsn/ebin
。如果應用程式在目錄 Prefix/Rest
中找到,則路徑為 VarName/Rest/App-Vsn/ebin
。在啟動 Erlang 時,所有變數 VarName
都會使用命令列旗標 boot_var
給定值。
範例:如果指定選項 {variables,[{"TEST","lib"}]}
且在 lib/myapp/ebin
中找到 myapp.app
,則此應用程式在啟動腳本中的路徑為 "$TEST/myapp-1/ebin"
。如果在 lib/test
中找到 myapp.app
,則路徑為 $TEST/test/myapp-1/ebin
。
透過指定選項 exref
,可以使用某些交叉參考檢查來擴充在產生啟動腳本之前執行的檢查。這些檢查會使用 Xref 工具執行。Xref 會檢查所有應用程式,或使用 {exref,[App]}
指定的應用程式,並且會針對呼叫未定義的函數發出警告。
預設情況下,錯誤和警告會列印到 tty,且函數會傳回 ok
或 error
。如果指定選項 silent
,則函數會改為傳回 {ok,Module,Warnings}
或 {error,Module,Error}
。可以透過呼叫 Module:format_warning(Warnings)
或 Module:format_error(Error)
將警告和錯誤轉換為字串。
如果指定選項 warnings_as_errors
,則警告會被視為錯誤。
如果指定選項 no_dot_erlang
,則在啟動期間載入 .erlang
檔案的指令不會包含在內。
-spec make_tar(Name) -> Result when Name :: string(), Result :: ok | error | {ok, Module :: module(), Warnings :: term()} | {error, Module :: module(), Error :: term()}.
等同於 make_tar(Name, [])
。
-spec make_tar(Name, Opts) -> Result when Name :: string(), Opts :: [Opt], Opt :: {dirs, [IncDir]} | {path, [Dir]} | {variables, [Var]} | {var_tar, VarTar} | {erts, Dir} | erts_all | src_tests | exref | {exref, [App]} | silent | {outdir, Dir} | no_warn_sasl | warnings_as_errors | {extra_files, ExtraFiles}, Dir :: file:filename_all(), IncDir :: src | include | atom(), Var :: {VarName, PreFix}, VarName :: string(), PreFix :: string(), VarTar :: include | ownfile | omit, App :: atom(), Result :: ok | error | {ok, Module :: module(), Warnings :: term()} | {error, Module :: module(), Error :: term()}, ExtraFiles :: [{NameInArchive, file:filename_all()}], NameInArchive :: string().
建立一個版本套件檔案 Name.tar.gz
。
此檔案必須在目標系統上使用 release_handler
解壓縮並解封裝,才能安裝新版本。
會讀取版本資源檔案 Name.rel
以確定版本中包含哪些應用程式。然後,會讀取相關的應用程式資源檔案 App.app
以確定每個應用程式的版本和模組(索引鍵 vsn
和 modules
,請參閱 app(4)
)。
預設情況下,版本套件檔案位於與 Name.rel
相同的目錄中。也就是說,在目前的工作目錄中,除非 Name
包含路徑。如果指定選項 {outdir,Dir}
,則它會位於 Dir
中。
如果 SASL 未作為應用程式包含在 .rel
檔案中,則會發出警告,因為此版本無法在升級中使用。若要關閉此警告,請新增選項 no_warn_sasl
。
預設情況下,發行套件會包含每個包含應用程式的 lib/App-Vsn/ebin
和 lib/App-Vsn/priv
目錄。如果需要包含更多目錄,則需指定 dirs
選項,例如 {dirs,[src,examples]}
。
所有這些檔案都會在當前路徑中搜尋。如果指定 {path,[Dir]}
選項,則此路徑會附加到當前路徑。萬用字元 *
會展開為所有符合的目錄。例如: "lib/*/ebin"
。
如果給定 {extra_files, ExtraFiles}
選項,則在新增完所有要包含的內容後,ExtraFiles
會被新增到 tarball 中。ExtraFiles
列表是一個檔案或目錄的列表,其格式與 erl_tar:add/3,4 的 add_type()
元組相同。
可以使用 variables
選項來指定某些應用程式的安裝目錄,而不是 lib
。如果指定變數 {VarName,Prefix}
並且在目錄 Prefix/Rest/App[-Vsn]/ebin
中找到應用程式,則該應用程式會被打包到單獨的 VarName.tar.gz
檔案中,路徑為 Rest/App-Vsn/ebin
。
範例: 如果指定選項 {variables,[{"TEST","lib"}]}
並且 myapp.app
位於 lib/myapp-1/ebin
中,則應用程式 myapp
會包含在 TEST.tar.gz
中
% tar tf TEST.tar
myapp-1/ebin/myapp.app
...
可以使用 {var_tar,VarTar}
選項來指定是否以及在哪裡儲存單獨的套件。在此選項中,VarTar
是下列其中之一
include
- 每個單獨的(變數)套件都包含在主要的ReleaseName.tar.gz
檔案中。這是預設值。ownfile
- 每個單獨的(變數)套件都會作為單獨的檔案產生,並與ReleaseName.tar.gz
檔案位於同一個目錄中。omit
- 不會產生單獨的(變數)套件。在變數目錄下找到的應用程式會被忽略。
發行套件中還包含一個 releases
目錄,其中包含 Name.rel
和一個子目錄 RelVsn
。RelVsn
是在 Name.rel
中指定的發行版本。
releases/RelVsn
包含啟動腳本 Name.boot
,已重新命名為 start.boot
,以及(如果找到)檔案 relup
和 sys.config
或 sys.config.src
。這些檔案會在與 Name.rel
相同的目錄、當前工作目錄以及使用 path
選項指定的任何目錄中搜尋。如果找到 sys.config.src
,則不會包含 sys.config
。
如果發行套件要包含新的 Erlang 執行時系統,則指定的執行時系統 {erts,Dir}
的 erts-ErtsVsn/bin
目錄會被複製到 erts-ErtsVsn/bin
。預設情況下,某些 erts 可執行檔不會被複製,如果你想包含所有可執行檔,可以給定 erts_all
選項。
在建立發行套件之前,會執行所有使用 make_script
函數進行的檢查。src_tests
和 exref
選項在這裡也有效。
傳回值以及錯誤和警告的處理方式與 make_script
中描述的相同。
-spec script2boot(File) -> ok | error when File :: string().
此函數將 File.script
啟動腳本轉換為二進位術語,並將其儲存在 File.boot
檔案中。
Erlang 執行時系統要求用於啟動系統的腳本內容必須是二進位的 Erlang 術語。
使用 make_script
產生的啟動腳本已轉換為二進位格式。