如果你和我一样,在公司电脑上装 OpenClaw 之前已经在自己笔记本上成功跑通过一次,那你大概率会觉得这次安装只是走个流程。结果刚到依赖安装环节就被 libsignal-node 卡住:npm 进度条停在同一个位置几分钟不动,最后直接报 ETIMEDOUT,把日志翻到 verbose 才看清楚,它一直在尝试从 GitHub 的 release 地址下载预编译文件,而公司的网络策略并没有放行这条下载链路。
这个现象非常典型,尤其是在企业统一管控的办公网络里。问题几乎不在 OpenClaw 本身,而是它依赖的原生模块默认从 GitHub Releases 拉二进制文件,公司出口安全策略往往只放行了部分域名,后半段下载链路不在白名单内。这篇文章把我从现象定位、日志分析到最终改用 git 源码编译的完整过程整理出来,重点解决 libsignal-node 的 GitHub 下载失败问题。如果你也卡在这一步,下面的内容可以直接照着操作。
1. 定位问题第一步:弄清 libsignal-node 安装时到底在哪里下载了什么
很多人一看到 npm install 卡住,第一反应是网络没连上或者 OpenClaw 安装包有问题,于是反复重试、重启电脑,甚至把 Node.js 卸载重装。这些操作基本没用,因为问题不在你的机器,也不在 npm 主源,而在依赖包安装脚本要去访问的那个外部地址。
libsignal-node 是 Signal 官方 libsignal 库的 Node 原生绑定,OpenClaw 的依赖树里带了这个模块,主要承担消息加密相关的底层能力。这类原生模块的发布方式和普通 npm 包不太一样:普通的 JavaScript 包直接把源码推到 npm registry,安装时下载下来就能用;而 libsignal-node 这种带编译产物的原生模块,为了照顾大多数人的安装体验,官方会预先编译好几个平台的二进制文件,把这些文件挂到 GitHub Releases 上,同时把一层很薄的 JS 包装代码发布到 npm。
也就是说,npm install 的时候分两步走:
- npm 首先从 registry 下载 libsignal-node 的 JS 包装包,这一步走的是 npm 官方源或者你配置的内部源,通常没问题。
- 包装包安装完成后,它的 postinstall 脚本会调用 prebuild-install,去 GitHub Releases 下载与你当前操作系统和 Node ABI 匹配的预编译文件,下载完成后放到指定目录,模块才能被 require 正常加载。
问题恰恰出在第二步。公司办公电脑的网络出口一般有统一管控,github.com 这个域名可能已经被放行,所以你在浏览器里打开 GitHub 页面没问题,甚至 git clone 也能用。但那些 release 资产并不真的存放在 gith
