ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Erlang/OTP 27 弃用功能迁移指南:Archives 打包与 erl 启动参数的变化

Erlang/OTP 27 弃用功能迁移指南:Archives 打包与 erl 启动参数的变化 编程语言语言运行时标准库编译器并发编程【免费下载链接】otpErlang/OTP项目地址https://gitcode.com/gh_mirrors/ot/otp点击查看免费下载本篇指南基于 deprecations_27.md 梳理 Erlang/OTP 27 引入的弃用deprecated功能代码路径中的归档文件archive机制以及两个erl命令行参数。读完本文你将明确哪些用法即将失效、官方推荐的替代方案是什么并能直接迁移到 kernel 应用参数的新配置方式避免在 OTP 28 移除这些功能后破坏现有启动脚本与发布打包流程。OTP 27 弃用总览OTP 27 的弃用清单集中在两处一是**归档文件archive**相关功能二是erl 启动参数中的两个 flag。前者涉及代码加载机制后者涉及分布式节点启动时的 EPMD 通信配置。两类弃用都有明确的替代方案属于提前一个版本发出警告、在 OTP 28 中移除的常规节奏。例如 init.erl 中明确标注-code_path_choice从 OTP 27 起默认值为strict并计划在 OTP 28 移除。Archives 相关弃用弃用内容以下三种与 archive 相关的功能在 OTP 27 被标记为弃用使用 archive 文件打包单个应用或单个应用的一部分并将其放入代码路径——即把 BEAM 文件与其他数据文件压缩进一个归档文件再将该归档文件作为代码路径中的一个条目加载erl_prim_loader模块中处理 archive 的所有功能——erl_prim_loader是预加载的原始文件加载器此前承担了从 archive 中读取模块、目录列表与文件信息的能力相关实现可见 erl_prim_loader.erl其中包含set_primary_archive/4、purge_archive_cache/0以及大量archive_*内部函数erl的-code_path_choiceflag——该 flag 用于控制代码路径中每个目录的解析方式。-code_path_choice的语义与替代从 init.erl 的说明看-code_path_choice接受strict或relaxed两个取值strict严格按照 boot script 中出现的目录解释代码路径不尝试任何变通relaxed当可以在普通ebin目录与归档文件中的ebin目录之间选择时init会更宽松地寻找合适的目录。该选项默认值自 OTP 27 起即为strict并且整个选项已被列入移除计划OTP 28 移除。init内部通过code_path_choice/0读取启动参数并据此决定代码路径加载行为见 init.erl 及第 1210 行附近对PathChoice的使用。Escript 中的 archive 不受影响需要特别强调的是使用单个 archive 文件在 Escript 中承载 BEAM 文件和其他数据文件并不在弃用之列。Escript 本身就是一种将脚本与代码打包成单个可执行归档的标准分发方式这一用法会继续保留。不过有一个行为变化需要注意此前可以通过代码路径机制直接访问 archive 内的文件而现在访问 archive 中的文件必须显式调用escript:extract/2。该函数解析 Escript 文件的各个 sectionshebang、comment、emu_args、archive是escript:create/2的逆操作。其典型用法见 escript.erl escript:create(demo.escript, [shebang, {archive, [{demo.erl, SourceCode}, {demo.beam, BeamCode}], []}]). ok {ok, [{shebang,default}, {comment,undefined}, {emu_args,undefined}, {archive, ArchiveBin}]} escript:extract(demo.escript, []). {ok,[{{archive,80,75,3,4,20,0,0,0,8,0,118,7,98,60,105, 152,61,93,107,0,0,0,118,0,...} {emu_args,undefined}]}extract/2的返回结果中不存在的 section 对应值为undefined与默认值相同的 section 对应值为default若 Escript 内含源码source还可通过compile_source选项让其在提取时自动编译为 BEAM 代码。迁移建议如果你目前依赖将单个应用的归档文件放入代码路径来分发应用应当改为常规发布包直接使用目录形式的ebin代码路径这也是strict模式下的标准行为Escript 脚本继续使用 archive 打包但读取其中数据文件时改用escript:extract/2移除启动命令中的-code_path_choice参数接受 OTP 27 起的默认值strict为 OTP 28 的正式移除做准备。erl flags 弃用迁移到 kernel 应用参数OTP 27 弃用了两个与分布式节点 / EPMD 相关的 erl 启动参数替代方案统一收敛到kernel应用的系统配置参数中。这两个参数在 kernel_app.md 中有完整文档说明。-epmd_module Module→kernel应用参数epmd_module原命令行参数-epmd_module Module用于指定与 EPMD 通信的模块。OTP 27 起应改用 kernel 应用配置参数epmd_module%% sys.config 示例 [{kernel, [{epmd_module, my_epmd_module}]}].参数语义见 kernel_app.md类型为module()即一个实现了 EPMD 通信接口的模块名未配置时默认值为erl_epmd即 erl_epmd.erl 中实现的默认模块当配置参数与命令行参数同时存在时配置参数优先会覆盖命令行参数。-erl_epmd_port Port→kernel应用参数erl_epmd_node_listen_port原命令行参数-erl_epmd_port Port用于指定节点监听/连接其他节点的端口。OTP 27 起应改用 kernel 应用配置参数erl_epmd_node_listen_port[{kernel, [{erl_epmd_node_listen_port, 12345}]}].参数语义见 kernel_app.md类型为integer()配置erl_epmd用于监听连接并连接其他节点的端口设置了该端口后即使 EPMD 不可用Erlang VM 也会以分布式模式启动未设置时端口自动选择等价于端口0同样地配置参数存在时会覆盖命令行参数。源码层面的双通道读取逻辑在 erl_epmd.erl 的erl_epmd_node_listen_port/0函数中可以清晰看到新旧两种配置方式的共存与优先级处理首先读取 kernel 应用参数erl_epmd_node_listen_port若为不小于 0 的整数则采用若值非法会抛出{invalid_parameter_value, erl_epmd_node_listen_port, Invalid}其次通过init:get_argument(erl_epmd_port)读取旧的命令行参数-erl_epmd_port两者合并规则为仅配置参数 → 用配置参数仅命令行参数 → 用命令行参数两者同时指定则直接报错{invalid_configuration, either -erl_epmd_port or kernel erl_epmd_node_listen_port should be specified, not both}。这意味着迁移期间新旧方式可以并存但同一套配置中不要同时给出两者否则节点启动会失败。迁移建议将启动脚本如erl -epmd_module X、erl -erl_epmd_port P中的参数迁移到sys.config或application:set_env(kernel, ...)的对应 kernel 参数检查运维脚本与 CI 配置确保不存在命令行参数 配置参数同时指定epmd_module或erl_epmd_node_listen_port的情况若使用自定义 EPMD 兼容模块如inet_epmd_dist、inet_tcp_dist等分布式协议相关模块确认其配置方式已同步迁移到 kernel 应用参数。总结与版本时间线弃用项替代方案备注代码路径中的单应用 archive 打包常规ebin目录代码路径Escript 的 archive 用法保留erl_prim_loader中的 archive 功能不再提供Escript 场景改用escript:extract/2erl -code_path_choice无采用默认strictOTP 27 起默认strictOTP 28 移除erl -epmd_module Modulekernel 参数epmd_module配置参数优先于命令行参数erl -erl_epmd_port Portkernel 参数erl_epmd_node_listen_port两者同时指定会启动报错OTP 27 的这两组弃用体现了 Erlang/OTP 的两条演进主线一是收敛在代码路径中直接加载归档文件这一实验性机制init模块文档中即注明该支持是实验性的见 init.erl二是把分散在 erl 命令行的启动选项统一收编为kernel应用的可配置参数使节点启动行为可以集中声明、便于版本管理与自动化部署。升级到 OTP 27 及以上版本时按本文清单逐一核对启动命令与打包流程即可平滑过渡。赞分享编程语言语言运行时标准库编译器并发编程【免费下载链接】otpErlang/OTP项目地址https://gitcode.com/gh_mirrors/ot/otp点击查看免费下载相关推荐Erlang/OTP 的 erl 命令完全指南从启动参数、Emulator Flags 到运行环境配置Erlang/OTP 的 erl 命令完全指南从启动参数、Emulator Flags 到运行环境配置 erl 是 Erlang/OTP 运行时系统的启动入口编程语言语言运行时标准库编译器并发编程OpenCore Legacy Patcher 指南2008年的 Mac 也能装 macOS 15 的四步流程OpenCore Legacy Patcher 指南2008年的 Mac 也能装 macOS 15 的四步流程 你的 Mac 已经十年系统更新页面写着此编程语言语言运行时标准库编译器并发编程一个浏览器出一个 PDFOverleaf 在线 LaTeX 编辑器完整实操教程一个浏览器出一个 PDFOverleaf 在线 LaTeX 编辑器完整实操教程 Overleaf 是一个开源的、实时协作的在线 LaTeX 编辑器不用在本地编程语言语言运行时标准库编译器并发编程上一篇如何永久保存微信聊天记录3种格式导出完整指南下一篇Palworld存档转换终极指南轻松备份、修复和管理你的游戏数据创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表