0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

源码补丁神器—patch-package

京东云 来源:jf_75140285 作者:jf_75140285 2024-07-30 10:51 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一、背景

vue项目中使用 vue-pdf 第三方插件预览pdf,书写业务代码完美运行,pdf文件内容正常预览无问题。后期需求有变,业务需求增加电子签章功能。这个时候pdf文件的内容可以显示出来,但是公司的电子签章无法显示。这令人沮丧,因为已经编写了许多特定于此依赖项的代码,如果替换依赖库,这些代码很可能会被浪费。更重要的是其已经在生产环境运行。

在不更改依赖库进行大改动的前提下,先查找问题所在。经查发现此为官方bug 无法显示签章。进一步查询发现根源是其依赖包 pdf.js 的 电子签章不显示。

问题已定位到,要修改显示电子签章的代码是在node_modules的依赖包中。

如何解决此问题?

二、常用方法

1. 给依赖包提 issue 等待他人修复并发布

2. 给依赖包提 pr 自行修复并等待发布

3. 整体copy项目法

直接引用法

直接copy依赖包的源码,本地引用,不再通过npm包方式引用

发布私库法

适合多项目中使用同一个依赖包的场景,可以把修改后的源码发布到私有的仓库上

4. 修改引用法

配置一个webpack alias别名,如'原始文件的引用路径': '修改后文件的引用路径',使得最终修改后的文件被引用,如:

resolve: {  
    alias: {  
        'pdfjs': path.resolve(__dirname, './patched/pdfjs/*'), 
    }
}

以上方法均有弊端:

前两种修复周期很长且依赖第三方,修复时间不定,不适合解决当前问题。

后几种方法都比较复杂,并且会导致项目臃肿,更容易忘记自己修改了源码的哪个部分,而且更新麻烦,每次都需要手动去更新代码,无法与插件同步更新。

有没有一种方法,可以优雅修改node_modules的源码?

三、patch-package

patch-package 让程序开发者立即修复并保留 npm 依赖项。是一个给依赖项打补丁的完美方案。

# fix a bug in one of your dependencies
vim node_modules/some-package/brokenFile.js

# run patch-package to create a .patch file
npx patch-package some-package

# commit the patch file to share the fix with your team
git add patches/some-package+3.14.15.patch
git commit -m "fix brokenFile.js in some-package"

使用方法:

1.安装

npm i patch-package

如果你不需要在生产中运行

npm i patch-package --save-dev

yarn、pnpm、docker安装命令可查看其 git官网。

2. 修改npm包

更改node_modules 文件夹中要修改依赖包的文件

3. 生成补丁

npx patch-package package-name

4. 添加自动执行命令

In package.json

 "scripts": {
    +  "postinstall": "patch-package"
 }

在本文示例中,在node_modules找到要修改的依赖包pdfjs-dist,修改代码如下:

wKgaomandYWAK35GAAJIUePYles986.jpg



执行npx patch-package pdfjs-dist,生成补丁,会在文件目录中生成一个patches文件夹,如下:

wKgZomandYaAKxFOAAIRwSjkvNM629.jpg



至此项目中的bug已修复,如何让更改内容在团队其他同事拉取代码后执行?

添加自执行命令如下,会在 npm install 后知执行。

wKgaomandYeAS_qtAAMMGc6ABoY933.jpg



patch文件是什么?

其实就是一些git diff记录描述。

原理: patch-package会将当前 node_modules下的源码与原始源码进行 git diff,并在项目根目录下生成一个patch补丁文件。

如何自测补丁是否生效?

手动删除项目中的node_modules,并重新执行npm install命令安装依赖包。安装成功后查看之前修改的 node_modules 依赖包中的文件,查看修改的代码是否依然存在,如果之前修改代码依然存在即表明补丁文件已经生效,如果你之前修改的代码不存在即表明补丁文件没有生效。

四、patch-package 好处

版本预检

当依赖项发生更改时,会以红色大写字母通知,需要检查所做修复是否仍然有效。npx patch-package 会直接报错**ERROR** Failed to apply patch for package xxxx at path,通过提示可以更方便定位问题。

节省空间

无需拷贝一份源码,使用git diff来记录补丁更节省空间,安全又便捷。

可审查

补丁可以作为正常审查过程的一部分进行审查。

五、注意事项

◦直接修改 node_modules 下的代码不是被推荐的做法,应该仅在应急情况下考虑

◦长期还是需要彻底修复第三方包缺陷并逐步移除项目中的 .patch 文件

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 源码
    +关注

    关注

    8

    文章

    689

    浏览量

    31522
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    NI package manage搜索显示无网络情况问题

    在NI package manage中搜索驱动,显示如下报错,请问是什么原因,应该怎么解决。
    发表于 04-12 14:48

    WebRTC源码级深度解析(完结) (讠果xingkeit-top)#WebRTC #源码

    源码
    jf_82580774
    发布于 :2026年03月30日 15:22:21

    Windows 和 Mac 设备混着管,一个控制台,补丁管理轻松拿捏

    曾经企业办公系统高度统一,清一色全是Windows电脑,或者全员都用Mac,一套工具就能搞定全公司补丁。但如今,混合办公、BYOD普及,绝大多数公司都变成了Windows+Mac双系统混用的环境
    的头像 发表于 03-26 16:59 1145次阅读
    Windows 和 Mac 设备混着管,一个控制台,<b class='flag-5'>补丁</b>管理轻松拿捏

    IT 补丁管理的8大深坑,一招全破解

    很多IT团队一到每月的“补丁星期二”就头疼,设备多、远程管不过来、补丁总漏打、怕更崩系统、审计要的材料拿不出来。对企业来说,补丁管理绝不仅仅是看到更新提示点一下“立即更新”那么简单,而是一套关乎终端
    的头像 发表于 03-19 17:05 861次阅读
    IT <b class='flag-5'>补丁</b>管理的8大深坑,一招全破解

    深度解析 | DMA-BUF适配Android与RK特性核心Patch:高性能内存管理升级方案

    在嵌入式Linux与Android设备中,DMA-BUF作为跨进程、跨设备的内存共享核心机制,直接决定了图形渲染、视频编解码、相机采集等关键场景的性能表现。一款针对dma-buf的核心补丁add
    的头像 发表于 03-16 08:16 3034次阅读
    深度解析 | DMA-BUF适配Android与RK特性核心<b class='flag-5'>Patch</b>:高性能内存管理升级方案

    Rockchip CIF驱动深度解析:从架构设计到电源计数补丁修复

    稳定性。本文将从「驱动整体架构」入手,拆解核心文件功能与调用关系,再聚焦「Sensor 电源引用计数补丁」,详解如何通过补丁解决实际运行中的稳定性问题,为驱动开发与调试提供完整参考。
    的头像 发表于 02-06 16:49 4955次阅读
    Rockchip CIF驱动深度解析:从架构设计到电源计数<b class='flag-5'>补丁</b>修复

    RK3588 MIPI转LVDS屏幕调试全流程(附完整Patch

    转换 IC(如 TC358775XBG)时,软硬件协同排查更需精准。本文结合实际项目案例,梳理从问题定位到功能验证的标准化步骤,并附上完整调试 Patch,帮你快速突破瓶颈。
    的头像 发表于 02-05 13:52 1182次阅读
    RK3588 MIPI转LVDS屏幕调试全流程(附完整<b class='flag-5'>Patch</b>)

    技术分享 | RK3588增加Xenomai3实时补丁

    Xenomai是一套为嵌入式系统设计的实时开发框架,通过“双内核”架构,让Linux既能处理复杂的通用任务,又能可靠地完成那些对响应时间有极端要求的任务,广泛用于工业自动化、机器人、航空航天等对实时性要求极高的场景。本篇文章以启扬RK3588开发板为例,分享如何增加Xenomai3实时补丁
    的头像 发表于 11-27 17:29 1859次阅读
    技术分享 | RK3588增加Xenomai3实时<b class='flag-5'>补丁</b>

    别让小疏忽酿成大风险,这些补丁误区你避开了吗?

    补丁管理始终是维护系统安全与稳定的核心环节,它能确保操作系统、应用程序及终端设备时刻保持最新状态,获取最新的安全防护与功能支持。这一关键环节中的细微疏漏,往往成为引爆安全危机的导火索,可能让企业直面
    的头像 发表于 11-12 17:02 1384次阅读
    别让小疏忽酿成大风险,这些<b class='flag-5'>补丁</b>误区你避开了吗?

    【米尔RK3506国产开发板评测】3、实时补丁以及EtherCAT IGH移植

    的指令格式如下 patch -p1 < path/to/patch-x.y.z Rockchip SDK中的doc/Real-Time-Performance目录下有相关的实时内核补丁
    发表于 10-27 10:09

    【米尔NXP i.MX 91开发板评测】移植和运行RT-Linux,实时性能测试

    : $p\" patch -p1 < patches/$p done echo \"RT补丁应用完成\" 配置和编译实时内核 echo \"配置
    发表于 09-01 10:11

    智能小车设计源码和图纸资料

    智能小车设计源码和图纸
    发表于 08-25 15:38 1次下载

    迅为RK3568开发板OpeHarmony学习开发手册1.1-内核移植优化

    ;copy 到 out 目录-->打新补丁 那么优化思路是什么呢? out/kernel/src_tmp/linux-5.10/ linux-5.10/ 下的内核源码是已经打过原始内核补丁
    发表于 07-26 10:37

    【HZ-RK3568开发板免费体验】3、开启Linux Kernel RT功能

    微提供配套SDK的Preempt-RT补丁。 1、Linux PREEMPT_RT补丁 Linux Kernel应用补丁的指令格式如下 patch -p1 < path
    发表于 07-22 14:03

    (ST大赛三等奖作品)超声波自拍神器实例项目

    (ST大赛三等奖作品)超声波自拍神器电路图:
    发表于 05-28 21:04