通过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,把修改的部分反向加载进去,达到修改第三方依赖的效果。这种思路相对来说侵入性小,源代码是干净的,以后如果有机会可以尝试一下。

#npm

SideEffect is a blog for front-end web development.
Code by Axiu / rss