pnpm 中无法使用 patch-package 打补丁
原文:https://lwebapp.com/zh/post/pnpm-patch-package
介绍
前端开发过程中,经常会遇到第三方开源库有 BUG 的情况,通常我们有以下处理方式
- 自己 fork 一份源码修改,修复完后就可以本地打包直接用了。如果你想分享你的研究成果给其他人,可以再传到 npm 仓库或者提交 PR 给源仓库。这种方式有个缺点,就是笔记难保持和官方库的同步。
- 等待库作者修复。这种方式不太靠谱,因为开源作者一般都会比较忙,你的需求可能不会排在前面。
有些小伙伴不知道,还有一种方案是给本地 npm 包打补丁。意思是你的项目在正常安装某个 npm 依赖的情况下,通过在项目里增加一个补丁文件,就可以将对这个 npm 包的修改持久保存到项目中。这样就能实现针对开源库的 bug 修复直接应用到项目中。
小编了解到有一个叫 patch-package 的开源库,可以轻松的做到给 node_modules 的库打补丁。接下来我们看看如何使用 patch-package ,以及使用过程中有什么问题。
如何使用 patch-package
参照官方的教程,简单几步即可快速给本地 npm 包打补丁。
- 从 node_modules 中找到 npm 依赖包的源码,修复依赖包中的错误
vim node_modules/my-package/common.js
- 运行 patch-package 创建一个 .patch 文件,.patch 文件可以自动被 npm 识别并应用
npx patch-package my-package
- 提交补丁文件就可以与您的团队共享修复了
git add patches/my-package+3.14.15.patch
git commit -m "fix common.js in my-package"
- 安装下依赖包
npm i -D patch-package
- 在 package.json 中添加一个脚本 postinstall,支持在
npm i之后就会自动执行 patch-package 将补丁应用上
"scripts": {
"postinstall": "patch-package"
}
由于小编用的 pnpm 包管理器,在执行 npx patch-package my-package时候报错了
**ERROR** No package-lock.json, npm-shrinkwrap.json, or yarn.lock file.
You must use either npm@>=5, yarn, or npm-shrinkwrap to manage this project's
dependencies.
大概意思是支持npm、yarn包管理器,不支持pnpm。
官方也确实有 bug ,截止发稿日 2022 年 6 月 18 日,这个问题还是没有被修复的。
有人已经给 patch-package 提过 bug 了,见issue :How to execute patch to dependencies in other dependencies, when using pnpm #338
不过小编能力有限,只能另辟蹊径,采取变通方案
pnpm 打补丁
pnpm包管理器下给npm依赖包打补丁的思路是,将要修复的源码文件复制出来,放到项目里,在每次执行 npm i 安装依赖之后,用nodejs脚本将修改后的文件复制到源码目录中覆盖掉源代码,实现修改代码的目的。
- 修改好node_modules中依赖包源码文件,复制到跟目录的
patches目录下
vim node_modules/my-package/common.js
cp node_modules/my-package/common.js patches/my-package
- 在项目中新建一个脚本postinstall.js,实现覆盖源代码文件的操作
copyFileSync('./patches/my-package/common.js', './node_modules/my-package/common.js');
function copyFileSync(source, target) {
var targetFile = target;
// If target is a directory, a new file with the same name will be created
if (fs.existsSync(target)) {
if (fs.lstatSync(target).isDirectory()) {
targetFile = path.join(target, path.basename(source));
}
}
fs.writeFileSync(targetFile, fs.readFileSync(source));
}
- package.json 中新增一个postinstall命令指向我们的脚本
"scripts": {
"postinstall": "node scripts/postinstall.js"
}
总结
以上就是小编在一个使用pnpm包管理器的项目中实现给npm包打补丁的方案,如果您有更好的解决思路,欢迎分享出来。
参考
pnpm 中无法使用 patch-package 打补丁的更多相关文章
- 为什么多线程、junit 中无法使用spring 依赖注入?
为什么多线程.junit 中无法使用spring 依赖注入? 这个问题,其实体现了,我们对spring已依赖太深,以至于不想自己写实例了. 那么到底是为什么在多线程和junit单元测试中不能使用依赖注 ...
- Linux-学习patch命令打补丁,diff命令制作补丁(3)
patch:通过补丁文件,来对原文件打补丁 diff: 比较两个文件,然后生成一个补丁文件 1.patch用法 patch -p[剥离层级] <[补丁文件] 2.patch命令 ...
- java中不带package和带package的编译运行方式
Java中不带package的程序和带package的程序编译的方式是不同的. 一.不带package的程序建立个HelloWorld.java的文件,放入C:\,内容如下:public class ...
- block中无法使用C数组变量
在Objective-C的block中无法使用C数组,即使我们不对C数组做任何改变,编译的时候也会报错: #include <stdio.h> int main() { const cha ...
- 自坑实录 - Asp.net MVC中无法使用@Ajax.BeginForm问题解决
创建空的web项目,通过Nuget引用mvc组件来搭建空的MVC项目时, 在视图页面中无法使用@Ajax.BegForm来进行异步提交数据, 而新建默认的MVC模板项目却能够正常使用@Ajax.Beg ...
- model,map,MapAndVivew用于页面跳转时候使用的即跳转后才添加属性 这样再回调中无法使用 因为回调的前提是页面不调转;解决的方法是用responsewrite(普通的字符响应)
model,map,MapAndVivew用于页面跳转时候使用的即跳转后才添加属性 这样再回调中无法使用 因为回调的前提是页面不调转:解决的方法是用responsewrite
- Ruby中使用patch HTTP方法
Ruby中使用patch HTTP方法 如果使用patch,在后台可以看到只更新了改动的部分: Started PATCH "/ads/5/update" for ::1 at 2 ...
- CenterOS7中解决No package mysql-server available.
CenterOS7中解决No package mysql-server available. 1.使用yum install -y mysql-server报错如下: [root@heyong_jd ...
- 巧用svn create patch(打补丁)方案解决定制版需求
最近项目定制版越来越多,维护,同步代码非常费事.以前的思路如下图: 以前的svn目录结构如下图: 这样问题有2个: 若在一个定制包中修复了其他定制包也有的bug,同步更新其他包的代码时,非常费劲+机械 ...
- Java中import及package的用法
有些人写了一阵子 Java,可是对於 Java 的 package 跟 import 还是不 太了解很多人以為原始码 .java 档案中的 import 会让编译器把所 import 的程式通通写到编 ...
随机推荐
- 【译】15 个有用的 JavaScript 技巧
原文地址:https://javascript.plainenglish.io/15-useful-javascript-tips-814eeba1f4fd 1)数字分隔符 为了提高数字的可读性,可以 ...
- vue学习笔记(八)---- vue中的实例属性(wacth和computed的使用)
一.watch属性的使用 1.传统方式实现双向数据改变监听事件(姓名拼接案例) <div id="app"> 姓: <input type="text& ...
- vue学习笔记(一) ---- vue指令(v-for 和 key 属性)
vue指令之v-for和key属性 一. v-for 1. v-for遍历数组 <div id="app"> <h3>好饿,我好想吃~~~~</h3& ...
- 使用 DirectSound 录制麦克风音频
使用 DirectSound 录制麦克风音频 本文所有代码均可在以下仓库找到 https://gitcode.net/PeaZomboss/learnaudios 目录是demo/dscapture ...
- 学习Java Day21
今天学习了静态导入,可以导入静态方法和静态字段
- 跟着廖雪峰学python 005
函数的调用.定义.参数 编辑 #######命名关键字参数没完 abs()函数:绝对值 >>> abs(100) 100 >>> abs(-20) 20 ma ...
- Spring框架-IoC核心
spring框架(spring全家桶) spring FrameWork springBoot+springCloud+springCloud Data Flow 一:spring的两大核心机制: I ...
- 鼎阳SDS6204长波形读取的潜力挖掘及上海光源测试
https://blog.csdn.net/weixin_43767046/category_11089525.html 上学期我搭建起来的逐束团3维质心位置测量系统一直是获取500us长的一 ...
- 逆天的Zstack-工控机上测试
放假前一直在服务器上折腾Zstack跑数据库,调IOC.正好手头有个32G内存,intel i7处理器的工控机,就试试装Zstack跑跑看,想着即使重负荷的跑不了,跑跑docker之类的也行.装成功后 ...
- 修改ctags让fzf.vim插件显示C,C++方法声明的标签
背景 在 vim 中使用 fzf.vim 插件可以进行方便的搜索文件, 源码TAG, GIT 记录等, 最近抽空看了下 BTags 命令在 c, c++ 文件中, 无法显示头文件中的函数声明 标签问题 ...