依赖包有 bug 但作者跑路了怎么办?
小麦2025年05月04日625 字
场景#
有时候项目开发过程中发现依赖库有 bug,查了源码后感觉很容易修复,或者是有适用自己当前场景的简单修改方案。想提个 PR 但跑到 Github 上一看发现作者已经跑路了,这时候怎么办呢?
理论上可以自己 fork 一份,然后修复后发布一个自己的版本。但是可能要解决很多麻烦的环境问题,特别是年代久远的库,处理构建、发布、测试问题可能比改掉 bug 还要困难数倍。
解法#
遇到这种情况就可以试试 patch-package
这个工具。
官方介绍的用法是:
# fix a bug in one of your dependencies# 直接到 node_modules 里找到对应的文件,修改后保存。vim node_modules/some-package/brokenFile.js# run patch-package to create a .patch file# 运行 patch-package 会自动在 patches 目录下生成一个 .patch 文件npx patch-package some-package# commit the patch file to share the fix with your team# 把 .patch 文件提交到 git 仓库git add patches/some-package+3.14.15.patchgit commit -m "fix brokenFile.js in some-package"
实操#
比如我遇到 @volcengine/openapi
这个库的一个兼容性问题,它直接内联了一个魔改版 lz4
导致不兼容我的项目运行环境。
检查 lz4
的执行链路后,暂且可以注释掉该 import 解决问题。随后执行:
npx patch-package @volcengine/openapi
生成的 patch 文件如下:
diff --git a/node_modules/@volcengine/openapi/lib/services/tls/service.js b/node_modules/@volcengine/openapi/lib/services/tls/service.jsindex 5575cd8..4e5178e 100644--- a/node_modules/@volcengine/openapi/lib/services/tls/service.js+++ b/node_modules/@volcengine/openapi/lib/services/tls/service.js@@ -6,7 +6,8 @@ Object.defineProperty(exports, "__esModule", { value: true });const axios_1 = __importDefault(require("axios"));const sign_1 = __importDefault(require("../../base/sign"));const protobufjs_1 = __importDefault(require("protobufjs"));-const lz4_1 = __importDefault(require("./lz4"));+// const lz4_1 = __importDefault(require("./lz4"));+const lz4_1 = { default: { encodeBound: () => 0, encodeBlock: () => 0 } };const path_1 = __importDefault(require("path"));const utils_1 = require("./utils");const TIMEOUT = 100000;
接着在 package.json
的 postinstall
脚本中执行 patch-package
命令:
{"scripts": {+ "postinstall": "npx patch-package"}}
这样每次跑 CI 时都会自动应用 patch 文件,完美解决问题。
需要注意的问题#
如果后来升级了依赖版本,那么需要重新执行 npx patch-package <pkg name>
命令生成新的 patch 文件。否则 patch 文件可能应用失败或错误。
其他方案#
如果你在用 pnpm,那么它有一个自带的 pnpm patch
命令,功能和 patch-package
类似。
pnpm patch <pkg name>@<version>