查看源代码 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.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.relUpFromDownTo 中指定的所有发布资源文件 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 生成的引导脚本已经转换为二进制形式。