Erlang/OTP 发布资源文件(.rel)完全指南:定义发布构成、驱动启动脚本与升级流程
编程语言语言运行时标准库编译器并发编程【免费下载链接】otpErlang/OTP项目地址https://gitcode.com/gh_mirrors/ot/otp点击查看免费下载rel.md是 Erlang/OTP 中 SASLSystem Architecture Support Libraries应用发布系统的核心参考文档。本文以 lib/sasl/doc/references/rel.md 为骨架讲解.rel发布资源文件的语法、五种应用启动类型与包含应用列表的语义并结合当前 OTP 仓库中 erts/start_scripts/ 下的真实示例、systools与release_handler的源码实现说明该文件如何驱动启动脚本.script/.boot、发布打包.tar.gz与在线升级relup的完整链路。读完本文你将能够独立编写、校验并运用.rel文件构建自己的 Erlang 发布。什么是发布资源文件发布资源文件Release Resource File是 Erlang/OTP 中一份声明式的发布清单它指定一个基于 Erlang/OTP 的发布release即一套系统中包含哪些应用Application以及各应用以何种方式被装载与启动。它的核心用途是作为systools各函数的输入生成启动脚本Name.script及其二进制形式启动文件Name.boot生成发布升级文件relup。此外release_handler在目标系统上执行发布打包、解包与在线升级时也必须依赖.rel文件中的信息见 lib/sasl/src/release_handler.erl一个发布包总是包含Name.rel发布资源文件和Name.boot启动文件。从 lib/sasl/src/systools.erl 的模块头注释可以直观看到.rel文件的三大消费方%% systools:make_script(RelName) %% Make a boot file from RelName.rel. %% Generates RelName.{script,boot} %% systools:make_tar(RelName) %% Make a release package from RelName.rel. %% Generates RelName.tar.Z %% systools:script2boot(File) %% File.script - File.boot文件语法与位置约定发布资源文件的文件名为Name.rel即文件名由发布名Name加上.rel扩展名组成。.rel文件的内容是一个单一的 Erlang term称为release specification发布规格。其完整语法如下{release, {RelName,Vsn}, {erts, EVsn}, [{Application, AppVsn} | {Application, AppVsn, Type} | {Application, AppVsn, IncApps} | {Application, AppVsn, Type, IncApps}]}.元组各字段说明字段类型含义RelNamestring()发布名称Vsnstring()发布版本号EVsnstring()该发布所针对的 ERTSErlang Runtime System版本Applicationatom()发布中包含的应用的名字AppVsnstring()发布中包含的应用的版本号Typepermanent \| transient \| temporary \| load \| none应用的启动类型默认permanentIncApps[atom()]被某应用“包含”的应用列表默认与.app文件中的取值一致启动类型Type的五种取值语义permanent/transient/temporary应用被加载并按照对应的方式启动。这三种启动类型的运行时语义由application模块定义permanent表示若该应用终止则整个节点也随之终止transient表示若该应用以normal以外的原因终止则节点终止temporary表示应用终止不影响节点。load应用仅被加载不被启动。none应用既不加载也不启动但其所属模块的代码仍会被加载到系统中即模块代码进入 code path 并可用。注意Type字段缺省时的默认值为permanent。包含应用列表IncAppsIncApps是由某个被包含的应用所进一步包含的应用列表。它必须满足必须是该应用的应用资源文件Application.app中included_applications声明的子集当在.rel中显式给出时会覆盖.app文件中的对应取值缺省时与.app文件中的included_applications取值相同。强制约束注意.rel中的应用列表必须包含 Kernel 与 STDLIB 两个应用。这一约束不是文档层面的“建议”而是systools在生成启动脚本时的硬性检查如果 Kernel 和 STDLIB 未被包含或它们的启动类型不是permanent默认值make_script将直接失败见 lib/sasl/src/systools.erl。仓库中的真实示例OTP 仓库自带的启动脚本模板为我们提供了权威的.rel写法参考这些文件位于 erts/start_scripts/ 目录下均为构建期模板其中的%XXX%形式变量在构建时被替换为实际版本号。最简发布仅含 Kernel 与 STDLIBerts/start_scripts/start_clean.rel.src 是“干净”启动脚本对应的发布资源只包含两个强制应用{release, {Erlang/OTP,%SYS_VSN%}, {erts, %ERTS_VSN%}, [{kernel,%KERNEL_VSN%}, {stdlib,%STDLIB_VSN%}]}.erts/start_scripts/no_dot_erlang.rel.src 与之结构相同用于不读取.erlang文件的启动场景。加入 SASL可用于在线升级的最小发布erts/start_scripts/start_sasl.rel.src 在强制应用之上增加了sasl{release, {Erlang/OTP,%SYS_VSN%}, {erts, %ERTS_VSN%}, [{kernel,%KERNEL_VSN%}, {stdlib,%STDLIB_VSN%}, {sasl, %SASL_VSN%}]}.这正是文档“See Also”与systools检查逻辑所强调的升级前提如果 SASL 未包含在.rel中systools:make_script/2与make_tar/2会发出警告因为不包含 SASL 的发布无法用于在线升级可以通过选项no_warn_sasl关闭该警告见 lib/sasl/src/systools.erl。扩展示例大型发布erts/start_scripts/start_all_example.rel.src 展示了包含多个应用的发布写法注意这里各应用均未显式给出Type因此全部取默认值permanent{release, {Erlang/OTP,%SYS_VSN%}, {erts, %ERTS_VSN%}, [{kernel,%KERNEL_VSN%}, {stdlib,%STDLIB_VSN%}, {sasl, %SASL_VSN%}, {os_mon, %OS_MON_VSN%}, {inets, %INETS_VSN%}, {snmp, %SNMP_VSN%}, {mnesia, %MNESIA_VSN%}]}.从 .rel 到可启动系统systools 的消费流程.rel文件本身不会被运行时直接读取它需要先经过systools加工。完整链路如下编写Name.rel按上文语法声明发布名、版本、ERTS 版本与应用清单。调用systools:make_script/1,2读取Name.rel确定发布包含哪些应用再读取各应用的应用资源文件App.app其中modules键决定装载哪些模块、mod键决定如何启动应用生成启动脚本Name.script与二进制启动文件Name.boot默认输出到Name.rel所在目录可通过选项{outdir, Dir}指定其他目录。以启动文件启动系统erl -boot Name使用Name.boot启动系统见 lib/sasl/doc/references/script.md 中对启动脚本语法的完整说明。可选systools:make_tar/1,2基于Name.rel生成发布包Name.tar.gz用于部署到目标系统再由release_handler解包安装。可选systools:make_relup/3,4以.rel、.app、.appup为输入生成发布升级文件relup支撑运行中系统的在线升级与回退见 lib/sasl/doc/references/relup.md。make_script 对 .rel 的正确性检查根据 lib/sasl/src/systools.erl 的说明systools:make_script/2会对.rel与.app做如下一致性校验.rel中声明的应用版本必须与对应.app文件中的版本一致不允许存在“未定义应用”即依赖了未包含在发布中的应用检查.app中的applications键代码装载路径中的所有模块必须能找到对应对象代码且不存在缺失或比对象代码更新的模块Kernel 与 STDLIB 必须包含在.rel中且启动类型为permanent否则函数失败SASL 未包含时发出升级相关警告可用no_warn_sasl关闭。此外systools会按应用之间的依赖关系对应用排序在没有依赖关系的应用之间保持.rel文件中声明的顺序见 lib/sasl/src/systools.erl。这意味着.rel中的书写顺序会影响最终启动脚本中应用的装载/启动次序。release_handler 侧的校验在目标系统一侧release_handler同样会对.rel内容做校验。据 lib/sasl/src/release_handler.erl 记载若指定的.rel文件无法读取或其中不是单一 term将返回{bad_rel_file, File}若.rel内容不是被识别的 release specification则返回{bad_rel_data, Data}。发布构建实操示例假设你要构建一个名为myapp、版本1.0的发布仅依赖标准库则myapp.rel可写为{release, {myapp, 1.0}, {erts, 15.0}, [{kernel, 10.0}, {stdlib, 6.0}, {myapp, 1.0, permanent}]}.然后在 Erlang shell 中生成启动脚本与启动文件systools:make_script(myapp, [{outdir, releases/1.0}]).生成成功后在releases/1.0/下会得到myapp.script与myapp.boot之后即可用erl -boot releases/1.0/myapp启动该系统。若需要打包分发再执行systools:make_tar(myapp, [{outdir, releases}]).生成myapp.tar.gz发布包交由release_handler在目标节点解包并安装set_unpacked/1、install_release/1等接口。与相关文件的关系应用资源文件App.app定义应用版本、模块清单、依赖applications与包含应用included_applications是.rel中AppVsn、IncApps取值的依据来源。启动脚本Name.script/ 启动文件Name.boot.rel经systools展开后的产物描述系统启动时加载哪些代码、启动哪些进程与应用见 lib/sasl/doc/references/script.md。应用升级文件App.appup与发布升级文件relup在线升级的低层指令来源与汇总结果见 lib/sasl/doc/references/appup.md 与 lib/sasl/doc/references/relup.md。小结.rel发布资源文件是 Erlang/OTP 发布系统的“总清单”它以单一 Erlang term 声明发布名、版本、ERTS 版本、应用清单及其启动类型约束 Kernel 与 STDLIB 必须存在并通过IncApps精确控制应用的包含关系。它本身不直接参与运行时而是经由systools:make_script/2、make_tar/2、make_relup/3,4转换为启动脚本、发布包与升级指令再由release_handler在目标系统上执行安装与升级。掌握.rel的语法与语义是构建可部署、可升级 Erlang 系统的基本功——仓库 erts/start_scripts/ 下的三份模板clean / sasl / all example即是可直接对照学习的权威范例。赞分享编程语言语言运行时标准库编译器并发编程【免费下载链接】otpErlang/OTP项目地址https://gitcode.com/gh_mirrors/ot/otp点击查看免费下载相关推荐Erlang/OTP erl_call 命令完全指南从 Shell 脚本远程调用与启动分布式 Erlang 节点Erlang/OTP erl_call 命令完全指南从 Shell 脚本远程调用与启动分布式 Erlang 节点 erl_call 是 Erlang/OTP编程语言语言运行时标准库编译器并发编程React Router 发布流程全解change 文件、版本脚本与 GitHub Actions 自动发布流水线React Router 发布流程全解change 文件、版本脚本与 GitHub Actions 自动发布流水线 React Router 的版本发布几乎完前端路由如何快速集成MTMigration到你的iOS项目5分钟入门教程如何快速集成MTMigration到你的iOS项目5分钟入门教程 MTMigration是一款专为iOS应用设计的版本更新代码管理工具能够帮助开发者轻松处理编程语言语言运行时标准库编译器并发编程上一篇3步掌握Legacy-iOS-Kit旧设备降级、越狱与系统恢复终极实战下一篇5分钟搞定Android Studio中文界面免费插件让开发效率提升50%创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

AI编程工具实战选型指南:按开发场景匹配Claude Code/Cursor/Trae/OpenCode

AI编程工具实战选型指南:按开发场景匹配Claude Code/Cursor/Trae/OpenCode

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 15:41:59 阅读更多 →
Linux killall命令详解:按名杀进程的实操指南与避坑经验

Linux killall命令详解:按名杀进程的实操指南与避坑经验

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 15:41:59 阅读更多 →
EOSIO 智能合约部署实战:基于 eos 仓库的 cleos set contract 完整指南

EOSIO 智能合约部署实战:基于 eos 仓库的 cleos set contract 完整指南

区块链 【免费下载链接】eos An open source smart contract platform 项目地址: https://gitcode.com/gh_mirrors/eo/eos 点击查看 免费下载 本指南讲解如何在 EOSIO 区块链上部署智能合约:从环境准备、命令语法、参数细节,到 cleos set c…

2026/9/24 15:41:59 阅读更多 →

最新新闻

ClaudeCode 四层架构拆解:用 TaoToken 统一 Key 打通配置链路

ClaudeCode 四层架构拆解:用 TaoToken 统一 Key 打通配置链路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 10:21:10 阅读更多 →
2026企业智能体平台选型指南:OpenClaw替代方案与TaoToken统一接入配置实战

2026企业智能体平台选型指南:OpenClaw替代方案与TaoToken统一接入配置实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 10:21:10 阅读更多 →
林州省心的GEO推广服务团队怎么选,避坑挑选指南

林州省心的GEO推广服务团队怎么选,避坑挑选指南

林州省心的GEO推广服务团队怎么选?避坑挑选指南来了GEO(生成式引擎优化)是针对AI搜索引擎和智能问答平台的优化服务,核心价值是帮助林州本地企业工厂在AI搜索推荐中抢占靠前位置,让目标客户通过AI工具找到您,获得精准获客线索。我是河南千度…

2026/9/25 10:21:10 阅读更多 →
2026年发电机租赁服务商选购参考汇总:临时用电与长期采购需求精准匹配

2026年发电机租赁服务商选购参考汇总:临时用电与长期采购需求精准匹配

发电机租赁服务商怎么选才能兼顾临时用电与长期采购的需求?为什么很多客户做完发电机租赁后,再做设备采购或置换还会踩坑?挑选同时满足租赁、出售、配套服务的服务商,有哪些可落地的参考标准?很多有临时用电需求的工地、户外项目团队,选发…

2026/9/25 10:21:10 阅读更多 →
KytyPS5 Vulkan渲染管线全解:从PM4图形命令流到像素输出的完整GPU模拟链路

KytyPS5 Vulkan渲染管线全解:从PM4图形命令流到像素输出的完整GPU模拟链路

KytyPS5 Vulkan渲染管线全解:从PM4图形命令流到像素输出的完整GPU模拟链路 【免费下载链接】KytyPS5 PlayStation 5 emulator for Windows, Linux and MacOS 项目地址: https://gitcode.com/gh_mirrors/ky/KytyPS5 KytyPS5 是一款支持 Windows、Linux 与 mac…

2026/9/25 10:21:10 阅读更多 →
2026年高定整木全屋定制工厂招代理加盟选哪家好,发展现状与市场占有率及排名研究分析报告

2026年高定整木全屋定制工厂招代理加盟选哪家好,发展现状与市场占有率及排名研究分析报告

当下国内家居消费市场正迎来结构性升级,别墅、大平层与私宅装修需求持续攀升,高定整木全屋定制赛道的热度不断走高,越来越多创业者选择入局高定木作代理加盟,寻找兼具实力与发展潜力的合作工厂。在一众品牌中,找到扎根…

2026/9/25 10:20:10 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →