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