pnpm patch 完整使用指南
pnpm patch 是 pnpm 提供的用于临时修改第三方依赖源码的核心命令,无需手动改动 node_modules 内的文件,修改会被妥善管理和复用,下面分步骤详细讲解。
一、核心作用
pnpm patch 的核心作用是:临时修改项目中已安装的第三方 npm 依赖的源码,解决第三方依赖存在的 bug、满足个性化需求等场景,且修改后的内容可被跟踪和复用,避免直接修改 node_modules 导致的修改丢失、团队协作不一致等问题。
二、完整使用步骤
步骤1:生成依赖的可编辑副本
首先,针对已安装的依赖,生成一个可编辑的临时副本,命令格式如下:
bash
# 基本用法:pnpm patch <package-name>[@<version>]
pnpm patch lodash # 不指定版本(默认当前项目安装的版本)
pnpm patch axios@1.6.0 # 指定具体版本(适用于多版本共存场景)执行命令后,pnpm 会输出两个关键信息:
- 临时编辑目录的路径(类似
/tmp/xxx/lodash) - 后续需要执行的
pnpm patch-commit <临时目录路径>命令(需留存)
此时,你可以进入该临时目录,对依赖的源码进行任意修改(修改逻辑和普通项目开发一致)。
步骤2:提交修改并生成 patch 文件
当你在临时目录中完成源码修改后,通过以下命令提交修改,生成对应的 patch 文件:
bash
# 格式:pnpm patch-commit <临时编辑目录的路径>
pnpm patch-commit /tmp/xxx/lodash # 路径替换为步骤1输出的实际路径执行该命令后,pnpm 会在项目根目录下自动创建 patches 文件夹,并在其中生成一个 patch 文件(命名格式类似 lodash@4.17.21.patch),该文件记录了你的所有修改差异,可被 Git 跟踪。
步骤3:让项目自动应用 patch 修改
修改 package.json 文件,在其中添加 pnpm.patchedDependencies 字段,指定需要应用 patch 的依赖及对应的 patch 文件路径,格式如下:
json
{
"name": "your-project",
"version": "1.0.0",
"pnpm": {
"patchedDependencies": {
"lodash@4.17.21": "./patches/lodash@4.17.21.patch",
"axios@1.6.0": "./patches/axios@1.6.0.patch" // 多个依赖可依次添加
}
}
}添加完成后,执行以下命令,pnpm 会自动应用 patch 修改到项目的 node_modules 中:
bash
pnpm install # 或简写 pnpm i此时,项目运行时会使用你修改后的依赖源码,而非原始的依赖包内容。
步骤4:修改后的更新/维护(可选)
- 若需要再次修改该依赖:重复步骤1-3,新的 patch 文件会覆盖旧文件(或生成新文件,需同步更新
package.json中的路径) - 若需要取消 patch 修改:删除
package.json中对应的patchedDependencies配置,删除对应的 patch 文件,再执行pnpm install即可恢复原始依赖 - 团队协作:将
patches文件夹和package.json提交到 Git 仓库,其他团队成员拉取代码后执行pnpm install,会自动应用 patch 修改,无需额外操作
三、补充说明
- 适用场景:临时修复第三方依赖 bug、个性化定制依赖功能、验证依赖修改效果等,不推荐长期依赖(长期需求建议提 PR 给依赖作者或 fork 后自行维护)
- 版本兼容性:
pnpm patch要求 pnpm 版本 ≥ 6.22.0,若版本过低,可通过pnpm add -g pnpm升级 - 注意事项:修改依赖源码时,尽量保持代码风格一致,避免破坏依赖的原有功能;若依赖后续升级,需重新验证 patch 是否兼容
总结
pnpm patch <包名>:生成可编辑的依赖副本pnpm patch-commit <临时路径>:提交修改生成 patch 文件package.json配置pnpm.patchedDependencies:关联依赖与 patch 文件pnpm install:自动应用 patch 修改,团队协作无缝同步
有时候不能修改 package.json,否则流水线编译不过。pnpm-lock.yaml 有记录这个 patch 信息就够了。