背景
在项目开发过程中,常常会遇到网上现有的开源插件并不能满足实际项目的预期,需要对源码进行修改。
修改源码往往有下面两种方式:
- 直接在项目
node_modules
下找到插件的源码直接修改,但是一旦重新安装就会失效,不方便维护使用 - 去 github 上 fork 代码到自己的仓库进行修改,并将修改后的代码发布到 npm 上使用,但是步骤十分麻烦
因此,推荐使用 patch-package
来修改源码,不受重新安装的影响。
使用
安装
npm install patch-package
修改文件
直接在 node_modules 中找到要修改依赖包的相关文件,直接修改
创建/更新补丁
npx patch-package package-name
package-name
就是要修改的依赖包名,例如我修改的是 @docusaurus/core
执行完成后,会在项目根目录的 patches 目录中创建补丁文件 @docusaurus+core+2.4.1.patch
(2.4.1 是依赖包版本),这个补丁需要提交到代码仓库中
支持修改依赖包的依赖包
例如修改 node_modules/@docusaurus/core/node_modules/chalk 包中的文件,通过 / 分隔
npx patch-package @docusaurus/core/chalk
额外选项
--use-yarn
:patch-package 默认是根据项目中的 lockfile 来决定使用 npm 还是 yarn,如果两种都有,则使用 npm,可以通过这个参数启用 yarn
--exclude <regexp>
:创建补丁文件时,忽略与正则表达式匹配的路径,路径相对于要修改的依赖包的根目录,默认:package\\.json$
--include <regexp>
:与--exclude <regexp>
相反,创建补丁文件时仅考虑与正则表达式匹配的路径,默认: .*
--case-sensitive-path-filtering
:使 --include 或 --exclude 中使用的正则表达式区分大小写
--patch-dir
:指定放置补丁文件的目录
打补丁
重新安装依赖包时,执行以下命令:
npx patch-package # 应用所有补丁
如果打补丁后,补丁文件被修改过,此操作将失败,此时可以重新安装 node_modules
额外选项
--reverse
:撤回所有补丁
--patch-dir
:指定补丁文件所在目录
部署
在 package.json
的 scripts 中加入 "postinstall": "patch-package"
,后续执行 npm install
命令时,就会自动为依赖包打补丁了