查看源代码 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 生成的引导脚本已经转换为二进制形式。