有时我们需要修改node_modules下的一些代码,但是node_modules不会提交到git仓库,修改也无法保存。我应该怎么办?这时候就可以使用patch-package工具了。比如我对node_modules下的acorn代码做了一些修改:增加了一个.js文件:在项目目录下执行npxpatch-packageacorn后,会生成这样一个目录:patches目录下的xx.patch文件修改成这样包记录在.这个patches目录可以提交到git仓库,当项目再次被拉下时,执行npxpatch-package应用更改。可以配置成postintsll,每次安装后依赖会自动运行。这确保对node_modules的更改包含在每个提取的代码中。学过的东西怎么用,怎么实现的?探究其实现原理分为两个方面,一是补丁文件是如何生成的,二是补丁文件是如何应用的。patches文件是如何生成的查看patches文件的内容,可以看出这是一个gitdiff:的确,patch-package是依赖gitdiff实现的patches文件生成的。首先patch-package会创建一个临时目录:然后在这个目录下写一个package.json文件,dependencies就是命令行参数指定的包名:我们到这个目录下看看:果然有这样的一个package.json。然后会在这个目录下执行yarninstall或者npminstall(patch-package现在不支持pnpm):之后会执行gitinit,add,commit生成一个基本的commit。然后复制当前node_modules目录下的修改包:然后gitadd,然后执行gitdiff,可以得到修改后的diff:这不是patches文件的内容吗:然后写入patches目录补丁的生成文件很简单,就是在临时目录下创建一个基本的commit,然后将新的内容复制到gitdiff生成的patches内容中。应用补丁的内容是如何实现的?如何应用补丁?我对acorn目录下的文件做了一些修改。生成的补丁文件包含增删改查:补丁文件记录了添加了哪些行,删除了哪些行,添加了哪些行。修订。如果手动打patches文件,不就是找到对应文件对应的行号,做反向操作吗?没错,patch-package也是这样实现的,不过是自动完成的:它会在读取patches文件后进行解析:这个解析的实现是对每一行的字符串进行判断,并进行不同的处理:最后可以得到a包含diff信息的对象包括哪些文件哪些行做了哪些改动:之后对不同的类型进行不同的操作就可以了:这样patches文件的改动就应用到node_modules下的packages上了.总结当我们需要对node_modules下的代码进行更改时,可以通过patch-packagexxx生成一个patches文件,提交到git仓库,然后通过patch-package更改拉取的代码。实现原理可以分为两部分:patches文件的生成就是在临时目录下生成package.json,下载依赖,生成commit,然后copy修改后的代码,两者做gifdiff比较生成补丁文件。patches文件的应用是patch-package自己实现parse,获取文件中哪些行被修改的信息,然后根据不同的类型进行不同的文件操作。总体来说,这个小工具的原理还是比较清楚的,但是解析补丁文件的部分还是有点麻烦。当你需要解析gitdiff信息时,也可以参考它的实现。
