当前位置: 首页 > Web前端 > HTML

不能在pnpm中使用patch-package来打补丁

时间:2023-03-28 18:37:19 HTML

原文:https://lwebapp.com/zh/post/p...简介在前端开发过程中,经常会遇到第三方开源库有BUG,通常我们自己fork一个源码修改,有以下几种处理方式。修复后可以在本地打包直接使用。如果你想与其他人分享你的研究成果,你可以将它们上传到npm存储库或向源存储库提交PR。这种方法有一个缺点,就是笔记很难和官方库保持同步。等待库作者修复。这种方法并不靠谱,因为开源作者一般都很忙,你的需求未必排在前列。有的小伙伴不知道,还有一个办法就是给本地的npm包打补丁。意思是当你的项目正常安装了一个npm依赖后,通过给项目添加补丁文件,就可以将这个npm包的修改永久保存到项目中。这使得开源库的错误修复可以直接应用于项目。小编了解到有一个开源库叫patch-package,可以很方便的给node_modules库打补丁。下面我们就来看看patch-package的使用方法,以及在使用过程中遇到的问题。patch-package的使用方法参考官方教程,简单几步即可快速给本地npm包打补丁。从node_modules中找到npm依赖包的源码,在依赖包vimnode_modules/my-package/common.js中修复错误,运行patch-package创建.patch文件,.patch文件可以自动识别npm并应用npxpatch-packagemy-package提交补丁文件并与您的团队共享。fixgitaddpatches/my-package+3.14.15.patchgitcommit-m"fixcommon.jsinmy-package"并安装依赖包npmi-Dpatch-package在package.json中添加脚本postinstall,支持npmi后自动执行patch-packagetoapplythepatchto"scripts":{"postinstall":"patch-package"}因为编辑器Manager使用的pnpm包,执行npxpatch-packagemy时报错-package**错误**没有package-lock.json、npm-shrinkwrap.json或yarn.lock文件。您必须使用npm@>=5、yarn或npm-shrinkwrap来管理该项目的依赖项。这可能意味着支持npm和yarn包管理器,但不支持pnpm。官方确实有bug。截至2022年6月18日,此问题尚未修复。已经有人提过patch-package的bug,见issue:Howtoexecutepatchtootherdependenciesinotherdependencies,whenusingpnpm#338但是小编能力有限,只能另辟蹊径,采用workaroundpnpm来pnpm包管理器下的patch给npm依赖包打补丁的思路是将需要修复的源码文件复制到项目中。每次执行npmi安装依赖后,使用nodejs脚本将修改后的文件复制到源码目录覆盖源码,达到修改代码的目的。修改node_modules中的依赖包源码文件,复制到根目录下的patches目录下vimnode_modules/my-package/common.jscpnode_modules/my-package/common.jspatches/my-package新建脚本postinstall。项目中的js,实现覆盖源码文件的操作目标){vartargetFile=目标;//如果target是目录,将创建一个同名的新文件if(fs.existsSync(target)){if(fs.lstatSync(target).isDirectory()){targetFile=path.join(target,路径.basename(source));}}fs.writeFileSync(targetFile,fs.readFileSync(source));}在我们的package.json脚本"scripts"中添加一个postinstall命令:{"postinstall":"nodescripts/postinstall.js"}总结以上就是我在使用pnpm包管理器的项目中修补npm包的解决方案。如果您有更好的解决方案,请分享。参考pnpmcannotusepatch-packagetopatchpatch-packagepnpm会教你如何使用patch-package给npm包打补丁