查看源码 修补 OTP 应用

简介

本文档描述了使用比已安装版本更新的一个或多个 Erlang/OTP 应用来修补现有 OTP 安装的过程。工具 otp_patch_apply 可用于此特定目的。它位于 Erlang/OTP 源代码树的顶层目录中。

otp_patch_apply 工具利用 应用程序资源文件 中的 runtime_dependencies 标签。此信息用于确定是否可以将补丁安装到给定的 Erlang/OTP 安装目录中。

阅读更多关于 Erlang/OTP 版本 17 中引入的 版本处理 的信息,其中还描述了如何确定安装是否包含一个或多个已修补的应用。

如果要应用来自不同 OTP 版本的多个 OTP 应用的补丁,则必须分多个步骤应用这些补丁。一次只能应用来自同一 OTP 版本的多个 OTP 应用。

先决条件

假设读者熟悉 构建和安装 Erlang/OTP。要能够修补应用程序,必须存在以下内容:

  • Erlang/OTP 安装。

  • 一个 Erlang/OTP 源代码树,其中包含要修补到现有 Erlang/OTP 安装中的更新的应用程序。

使用 otp_patch_apply

警告

修补应用程序是一个单向过程。在继续之前,请创建 OTP 安装目录的备份。

首先,在 $ERL_TOP 构建包含更新的应用的 OTP 源代码树。

注意

在应用补丁之前,您需要在源代码目录中对 OTP 进行完整构建。

配置并构建 OTP 中的所有应用程序

$ configure
$ make

$ ./otp_build configure
$ ./otp_build boot -a

如果已在 OTP 安装中安装了文档,请同时构建文档

$ make docs

成功构建后,就可以进行修补了。源代码树目录、安装目录和要修补的应用程序作为参数传递给 otp_patch_apply。每个应用程序的依赖项都会根据安装中的应用程序和其他作为参数给出的应用程序进行验证。如果检测到依赖项错误,脚本将中止。

otp_patch_apply 语法

$ otp_patch_apply -s <Dir> -i <Dir> [-l <Dir>] [-c] [-f] [-h] \
      [-n] [-v] <App1> [... <AppN>]

-s <Dir>  -- OTP source directory that contains build results.
-i <Dir>  -- OTP installation directory to patch.
-l <Dir>  -- Alternative OTP source library directory path(s)
             containing build results of OTP applications.
             Multiple paths should be colon separated.
-c        -- Cleanup (remove) old versions of applications
             patched in the installation.
-f        -- Force patch of application(s) even though
             dependencies are not fulfilled (should only be
             considered in a test environment).
-h        -- Print help then exit.
-n        -- Do not install documentation.
-v        -- Print version then exit.
<AppX>    -- Application to patch.

Environment Variable:
  ERL_LIBS  -- Alternative OTP source library directory path(s)
               containing build results of OTP applications.
               Multiple paths should be colon separated.

注意

运行 otp_patch_apply 时,需要完整的构建环境。

注意

-s-l 标识的所有源目录都应包含 OTP 应用程序的构建结果。

例如,如果用户想要将 /home/me/git/otp 中构建的 mnesiassl 的修补版本安装到位于 /opt/erlang/my_otp 的 OTP 安装中,则键入

$ otp_patch_apply -s /home/me/git/otp -i /opt/erlang/my_otp \
  mnesia ssl

注意

如果应用程序列表包含核心应用程序,例如 ertskernelstdlibsasl,则必须重新运行修补的 Erlang/OTP 安装中的 Install 脚本。

修补的应用程序将附加到已安装的应用程序列表中。查看 <InstallDir>/releases/OTP-REL/installed_application_versions

健全性检查

可以使用 Erlang shell 检查应用程序依赖项。应用程序依赖项在已安装的应用程序之间由 otp_patch_apply 验证,但这些并不一定是实际加载的依赖项。通过调用 system_information:sanity_check(),可以验证实际加载的应用程序之间的依赖项。

1> system_information:sanity_check().
ok

请查看 sanity_check() 的参考资料以获取更多信息。