Skip to content

patch-package

patch-package 是什么?

功能介绍

  • 修复第三方包的 bug:开发人员可以使用 patch-package 快速修复第三方包中的 bug,而无需等待原始包的维护者发布修复版本。
  • 添加自定义功能:通过 patch-package,开发人员可以添加自定义功能到第三方包中,而无需修改原始包的源码。
  • 版本控制:patch-package 生成的补丁文件可以与代码版本控制系统一起使用,从而确保团队成员之间对第三方包的修改得到有效管理和共享。
  • 避免 fork:使用 patch-package 可以避免因为需要修改第三方包而进行 fork,从而减少维护成本和复杂度。

patch-package 的原理

  • patch-package 的原理是基于 npm 包的本地补丁。当开发人员使用 patch-package 时,它会创建一个补丁文件(以 .patch 结尾),该补丁文件包含了对第三方包的修改内容。然后,patch-package 会在 npm install 时自动应用这些补丁,从而实现对第三方包的修改。

patch-package 的功能使用

shell

# 安装依赖
yarn add patch-package -D

# 打补丁后面跟一个包名;会生成一个patchs文件目录
yarn patch-package package-name
# npx patch-package package-name


# 应用补丁
yarn patch-packag
# npx patch-package

API 列表

参数说明
--create-issue当应用补丁时,如果发现问题,自动创建一个 GitHub issue 来报告问题。
--use-yarn使用 yarn 而不是 npm 来安装依赖和应用补丁。
--exclude <regexp>排除匹配指定正则表达式的文件,这些文件将不会被包含在补丁中。
--include <regexp> 只包含匹配指定正则表达式的文件,其他文件将不会被包含在补丁中。
--case-sensitive-path-filtering在应用补丁时,对文件路径进行大小写敏感的过滤。
--patch-dir指定存储补丁文件的目录,而不是默认的 patches 目录。

patch-package 的原理

patches 文件的生成

  • 首先 patch-package 会创建一个临时目录
  • 然后在这个目录写入一个 package.json 文件,dependencies 就是命令行参数指定的包名
  • 然后它会在这个目录下执行 yarn install 或者 npm install(patch-package 现在不支持 pnpm)
  • 之后就进行 git 的 init、add、commit,生成一个基础的 commit。
  • 然后把现在 node_modules 目录下的这个被修改过的包复制过去
  • 之后再 git add,然后执行 git diff,就能拿到改动的 diff

应用 patches 的内容

  • patches 文件里记录了对哪几行做了新增,哪几行做了删除,哪几行做了修改。
  • 应用这个 patches 文件的话,不就是找到对应文件的对应行数,做反向的操作
  • 它读取 patches 文件之后会进行 parse:
  • 这个 parse 的实现就是对每一行的字符串做判断,进行不同的处理:
  • 最终能得到一个包含 diff 信息的对象,包含了对什么文件的哪些行做了什么修改:
  • 之后对不同的类型做不同的操作就可以了

使用示例:修复第三方包中的 bug

修改 npm 包

  • patchpackge

生成差异文件

  • patch_package_patchfile

应用差异文件

  • patch_package_result

Released under the MIT License.