檢視原始碼 systools (sasl v4.2.2)

一套版本處理工具

此模組包含生成啟動腳本(.boot.script)、版本升級檔案(relup)和版本套件的函數。

另請參閱

app(4)appup(4)erl(1)rel(4)release_handlerrelup(4)script(4)

摘要

函數

產生一個版本升級檔案 relup,其中包含從一個或多個先前版本升級或降級的指令。

產生一個啟動腳本 Name.script 及其二進位版本,即啟動檔案 Name.boot,除非給定了 {script_name, ScriptName} 選項,在這種情況下,名稱為 ScriptName.scriptScriptName.boot

建立一個版本套件檔案 Name.tar.gz

此函數將 File.script 啟動腳本轉換為二進位術語,並將其儲存在 File.boot 檔案中。

函數

連結到此函數

make_relup(Name, UpFrom, DownTo)

檢視原始碼
-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().

等同於 make_relup(Name, UpFrom, DownTo, [])

連結到此函數

make_relup(Name, UpFrom, DownTo, [Opt])

檢視原始碼
-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 會與 UpFromDownTo 中指定的所有版本資源檔案 Name2.rel 進行比較。對於每個這樣的配對,會推導出以下內容

  • 要刪除哪些應用程式,即列在 Name.rel 中但未列在 Name2.rel 中的應用程式
  • 要新增哪些應用程式,即列在 Name2.rel 中但未列在 Name.rel 中的應用程式
  • 要升級/降級哪些應用程式,即列在 Name.relName2.rel 中但版本不同的應用程式
  • 如果模擬器在升級或降級後需要重新啟動,即如果 Name.relName2.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,且函數會傳回 okerror。如果指定選項 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

連結到此函數

make_script(Name, [Opt])

檢視原始碼
-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.scriptScriptName.boot

啟動檔案指定在 Erlang 執行階段系統啟動時要載入的程式碼和要啟動的應用程式。請參閱 script(4)

會讀取版本資源檔案 Name.rel 以確定版本中包含哪些應用程式。然後,會讀取相關的應用程式資源檔案 App.app 以確定要載入哪些模組,以及要如何啟動應用程式。(索引鍵 modulesmod,請參閱 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,且函數會傳回 okerror。如果指定選項 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 以確定每個應用程式的版本和模組(索引鍵 vsnmodules,請參閱 app(4))。

預設情況下,版本套件檔案位於與 Name.rel 相同的目錄中。也就是說,在目前的工作目錄中,除非 Name 包含路徑。如果指定選項 {outdir,Dir},則它會位於 Dir 中。

如果 SASL 未作為應用程式包含在 .rel 檔案中,則會發出警告,因為此版本無法在升級中使用。若要關閉此警告,請新增選項 no_warn_sasl

預設情況下,發行套件會包含每個包含應用程式的 lib/App-Vsn/ebinlib/App-Vsn/priv 目錄。如果需要包含更多目錄,則需指定 dirs 選項,例如 {dirs,[src,examples]}

所有這些檔案都會在當前路徑中搜尋。如果指定 {path,[Dir]} 選項,則此路徑會附加到當前路徑。萬用字元 * 會展開為所有符合的目錄。例如: "lib/*/ebin"

如果給定 {extra_files, ExtraFiles} 選項,則在新增完所有要包含的內容後,ExtraFiles 會被新增到 tarball 中。ExtraFiles 列表是一個檔案或目錄的列表,其格式與 erl_tar:add/3,4add_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 和一個子目錄 RelVsnRelVsn 是在 Name.rel 中指定的發行版本。

releases/RelVsn 包含啟動腳本 Name.boot,已重新命名為 start.boot,以及(如果找到)檔案 relupsys.configsys.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_testsexref 選項在這裡也有效。

傳回值以及錯誤和警告的處理方式與 make_script 中描述的相同。

-spec script2boot(File) -> ok | error when File :: string().

此函數將 File.script 啟動腳本轉換為二進位術語,並將其儲存在 File.boot 檔案中。

Erlang 執行時系統要求用於啟動系統的腳本內容必須是二進位的 Erlang 術語。

使用 make_script 產生的啟動腳本已轉換為二進位格式。