依赖包有 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.patch
git 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.js
index 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.jsonpostinstall 脚本中执行 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>

官方文档:https://pnpm.io/cli/patch

评论

你需要先登录才能发表评论
Made by 捣鼓键盘的小麦 / © 2025 Front Talk 版权所有