通过pnpm patch修改第三方依赖
2023年5月6日 • ... • ☕️ 1 min read
在做strapi相关的开发时,遇到某个插件特别难用,即不能自定义扩展,也不支持strapi自定义的覆盖方式。简单加个field比登天还难,官方还一本正经地说这个正在计划了(一年多)。wtf。。。
无奈开始翻阅github。不得不说遇事还是应该多看看issues,遇到的问题多了,总有大佬提供解决思路。今天就知道了如何修改第三方库(插件)。
思路大概是这样:工具把代码copy一份出来,修改完bug/增强,利用工具生成diff文件,打个patch包,然后放在package.json里的pnpm.patchedDependencies下,作为补丁加载进去。
pnpm下:
> pnpm patch strapi-plugin-xxx
> You can now edit the following folder: /private/var/folders/rk/3rwr0000gn/T/b000ffb828/user
进入给出的路径,编辑完之后,举行执行命令:
> pnpm patch-commit /private/var/folders/rk/3rwr0000gn/T/b000ffb828/user
这样就结束了。
最后在根目录下会生成一个patches文件夹,内容是对应的补丁strapi-plugin-xxx@1.x.x.patch
。同时,在package.json里,会多出一行
{
// ...
"pnpm": {
"patchedDependencies": {
"strapi-plugin-xxx@1.x.x.patch": "strapi-plugin-xxx@1.x.x.patch"
}
}
}
重新运行,即可看到改动生效。
在npm环境下,可以使用patch-package
这个第三方库来完成同样的事情。
比较文件区别,用了git的命令:
// https://github.com/ds300/patch-package/blob/75c4f0d15daf77914fda103c12dc45f667006c24/src/makePatch.ts#L212
git("add", "-f", packageDetails.path)
const diffResult = git(
"diff",
"--cached",
"--no-color",
"--ignore-space-at-eol",
"--no-ext-diff",
"--src-prefix=a/",
"--dst-prefix=b/"
)
可以看到patch完之后,会重新install,应该是借助patch,把修改的部分反向加载进去,达到修改第三方依赖的效果。这种思路相对来说侵入性小,源代码是干净的,以后如果有机会可以尝试一下。