使用 Yarn 为软件打补丁
使用 Yarn 为软件打补丁
上一篇提到 plugin-git 获取 git 子模块信息时,不能正确获取时间问题。于是根据源码对 plugin-git 插件进行一番修改之后,成功获取文章的修改时间信息。在此对 yarn 补丁功能的使用做些记录。
Yarn 补丁相关的命令
为某个软件包创建补丁,支持二级包名,比如 @vuepress/plugin-git 。它会提取软件包中的文件到临时目录,用户在临时目录修改之后,使用 patch-commit 子命令提交修改。
yarn patch <package>生成 patch 文件并注册到 package.json 文件当中,path 参数为上条命令创建的临时目录。除了 package.json ,生成的补丁文件也需要提交到版本仓库。
yarn patch-commit -s <path>更新补丁,该命令不同于第一条命令(不带 -u 参数),生成临时目录中的文件会根据已有的补丁文件作出相应的修改。而不带 -u 参数生成的临时目录中的文件则是软件包原本的样子,即使 package.json 包含补丁信息。
yarn patch -u <package>使用 yarn 为 plugin-git 打补丁
这是一个具体的打补丁的例子,其他软件包可以参考这个方法。相关步骤如下:
- 修改代码,测试
- 准备软件包
- 提交修改
- 更新补丁
- 基于已有内容修改
- 重新创建
第一步,修改代码只需要在 node_modules 目录找到 plugin-git 的软件包目录,然后修改其中的文件即可。这些修改能够直接生效,然后调试、修改、再调试……

第二步,准备软件包——执行下面的命令,会把软件包放到临时目录下,软件包中的内容不会有任何修改,就是它原本的样子。
yarn patch @vuepress/plugin-git

第三步,提交修改——把 node_modules 中修改的文件替换到刚才生成的文件下,就可以执行下面的命令——根据临时目录中所做的修改生成 patch 文件到 .yarn/patches 目录下;在 package.json 中记录修改,当执行 yarn install 时会根据 package.json 中的记录自动修改文件。最后应用补丁(只不过临时目录的修改也是从 node_modules 中拷贝过去的——不会发生变化罢了)。
# 拷贝文件
cp node_modules/@vuepress/plugin-git/lib/node/utils/getUpdatedTime.js /private/var/folders/tf/vp9nb9m13ys_c96f3jkkdgx40000gn/T/xfs-7d8e5614/user/lib/node/utils/
# 提交更新
yarn patch-commit -s /private/var/folders/tf/vp9nb9m13ys_c96f3jkkdgx40000gn/T/xfs-7d8e5614/user
# 应用修改
yarn install
第四步,更新补丁有两种方式,第一种是在已有的修改上再进行修改;第二种则是无视已经做过的修改,直接基于原有的内容修改。
先讨论第一种方式。在完成第三步之后,如果需要改进前面的内容,可以执行以下命令。生成的临时目录中的文件内容是根据前面操作修改过的内容。
yarn patch -u @vuepress/plugin-git同上面步骤提交之后,package.json 会更新原来记录和生成一个新的补丁文件。

第二种方式和软件初次打补丁方式相同,但是在提交更新前需要清除现有的补丁(记得备份 node_modules 中修改过的文件),否则部署时就会报错。

删除掉 package.json 文件中 resolutions 字段对应的内容,再执行 yarn install 即可清除补丁,另外 .yarn 目录中的补丁也应该同步删除。
