OpenClaw 安装踩坑全记录:npm 和 Bun 两种方式的原理差异与实战配置(2026)

10 阅读1分钟

上个月我把本地的 AI 开发工具链做了一轮清理,想把 Cherry Studio、Cline 这些客户端统一换成 OpenClaw 来管理模型调用。结果光是安装这一步就折腾了大半天——npm 装完跑不起来,换 Bun 又遇到依赖解析的问题。后来把两种包管理器的安装流程从头到尾捋了一遍,才搞明白 OpenClaw 的包结构到底是怎么回事。这篇把我踩的坑和搞清楚的原理都记下来,省得你们再走一遍。

OpenClaw 是一个开源的 AI 模型调用客户端,支持 OpenAI 兼容协议,npm 或 Bun 全局安装后直接在终端使用。两种安装方式的核心区别在于依赖解析策略和二进制编译链路不同,下面展开说。

先说结论

维度npm (v10.8+)Bun (v1.2+)
安装速度(冷启动)38s6.7s
依赖解析策略嵌套 node_modules扁平 + 硬链接
native addon 编译node-gyp → 需要 Python 3内置编译器,零额外依赖
postinstall 脚本默认执行默认执行,--ignore-scripts 可跳过
全局二进制链接npm link 软链到 prefix/binbun link 直接写 ~/.bun/bin
实测启动耗时420ms310ms

Bun 快是真快,但 OpenClaw 有个 native 模块在 Bun 下偶尔会炸。往下看。

环境准备

我的测试环境:

  • macOS 15.4 / M3 Pro
  • Node.js v22.3.0 + npm v10.8.1
  • Bun v1.2.7
  • OpenClaw v0.9.3(2026 年 4 月 18 号发的)

Windows 用户注意,OpenClaw 的 @openclaw/crypto-bridge 这个子包依赖 OpenSSL 3.x 的动态库。macOS 和 Linux 一般自带,Windows 上如果没装过 Visual Studio Build Tools 大概率会在 postinstall 阶段报错。

方案一:npm 全局安装

最常规的方式:

npm install -g @openclaw/cli

装完之后终端直接敲 openclaw 就能用。但这个"装完"中间发生了什么?

npm 安装链路拆解

graph TD
 A[npm install -g @openclaw/cli] --> B[解析 package.json dependencies]
 B --> C[下载 tarball 到全局 node_modules]
 C --> D{有 native addon?}
 D -->|是| E[node-gyp rebuild]
 E --> F[调用系统 Python3 + make/gcc]
 F --> G[编译 .node 二进制]
 D -->|否| H[跳过编译]
 G --> I[执行 postinstall 脚本]
 H --> I
 I --> J[写入 bin 软链接到 npm prefix/bin]
 J --> K[openclaw 命令可用]

关键在第 4 步。OpenClaw 依赖 better-sqlite3 做本地会话缓存,这个包有 C++ addon,必须走 node-gyp 编译。如果你机器上 Python 版本不对或者压根没装 Xcode Command Line Tools,就会看到这个:

gyp ERR! find Python - checking Python explicitly set from command line or npm configuration
gyp ERR! find Python - "python3" is not in PATH or produced an error
gyp ERR! find Python
gyp ERR! configure error
gyp ERR! stack Error: Could not find any Python installation to use

解决办法很暴力:

# macOS
xcode-select --install

# 确认 python3 在 PATH 里
python3 --version
# 我这里输出 Python 3.12.3

装完依赖重新跑一遍 npm install -g @openclaw/cli 就好了。

验证安装 + 配置 API

openclaw --version
# v0.9.3

openclaw config set base_url https://api.ofox.ai/v1
openclaw config set api_key sk-your-key-here

跑一下测试:

openclaw chat -m claude-sonnet-4-20250514 "用一句话解释 JavaScript 闭包"

响应大概 1.2 秒回来。没问题。

方案二:Bun 全局安装

bun install -g @openclaw/cli

6.7 秒装完,这速度确实离谱。

Bun 的安装原理和 npm 有什么不同

Bun 不用 node_modules 的嵌套结构。它把所有包下载到全局缓存(~/.bun/install/cache/),然后在项目目录里用硬链接指过去。全局安装时更简单——直接把 CLI 入口脚本链接到 ~/.bun/bin/openclaw

关键差异在 native addon 的处理。Bun 内置了一个轻量编译器,不依赖 node-gyp 那套 Python + make 的工具链。大部分情况下这是好事,装起来干净利落。

但我在 4 月 22 号实测时遇到了一个问题:

error: NativeModule compilation failed for @openclaw/crypto-bridge@0.9.3
 -> symbol not found: _EVP_chacha20_poly1305
 -> referenced from: /Users/me/.bun/install/cache/@openclaw/crypto-bridge@0.9.3/build/Release/crypto.node

这个 _EVP_chacha20_poly1305 是 OpenSSL 3.1+ 才有的符号。Bun 的内置编译器链接到了系统自带的 LibreSSL(macOS 默认),而不是 Homebrew 装的 OpenSSL 3。

解决方法:

export OPENCLAW_OPENSSL_PATH=$(brew --prefix openssl@3)/lib
bun install -g @openclaw/cli

加了这个环境变量之后编译就能找到正确的 .dylib 了。这个坑我翻了 OpenClaw 的 GitHub Issues 才找到,官方文档完全没提。

Bun 下的配置方式一样

openclaw config set base_url https://api.ofox.ai/v1
openclaw config set api_key sk-your-key-here

配置文件存在 ~/.openclaw/config.toml,两种安装方式共用同一个路径,所以你从 npm 切到 Bun 不需要重新配。

两种方式的依赖树对比

这个我觉得挺有意思的,用 npm ls --allbun pm ls --all 分别导出来对比了一下:

npm 装出来的 @openclaw/cli 总共拉了 147 个包,嵌套最深到第 7 层。Bun 装出来是 143 个包(有 4 个被 Bun 内置的 polyfill 替代了),全部扁平。

磁盘占用方面,npm 全局目录里 OpenClaw 占了 89MB,Bun 因为硬链接的关系实际只多占了 12MB(其他包已经在缓存里了)。

这解释了为什么 Bun 安装快那么多——不是网速差异,是少了解压嵌套和重复写盘的开销。

踩坑记录

坑 1:npm 和 Bun 同时装会冲突

我一开始两种都装了想对比,结果 which openclaw 指向 npm 的版本,但 Bun 的版本也在 PATH 里。敲 openclaw 偶尔走 npm 的偶尔走 Bun 的,取决于 PATH 顺序。

最后我选了只保留一个:

npm uninstall -g @openclaw/cli # 卸掉 npm 的
# 或者
bun remove -g @openclaw/cli # 卸掉 Bun 的

别两个都留着,真的会出幻觉 bug。

坑 2:postinstall 脚本里的 telemetry

OpenClaw v0.9.3 的 postinstall 会往 api.openclaw.dev 发一个匿名安装统计请求。如果你在公司网络环境里,这个请求可能被拦住,然后 postinstall 会 hang 住 30 秒才超时。

# npm 跳过 postinstall
npm install -g @openclaw/cli --ignore-scripts
# 手动跑编译
cd $(npm root -g)/@openclaw/cli && npm run build:native

# Bun 跳过
bun install -g @openclaw/cli --ignore-scripts
cd ~/.bun/install/cache/@openclaw/cli@0.9.3 && bun run build:native

坑 3:config.toml 的 model alias 不生效

这个不算安装问题但肯定有人会遇到。在 ~/.openclaw/config.toml 里配了 model alias:

[aliases]
sonnet = "claude-sonnet-4-20250514"
gpt = "gpt-5.5"

结果 openclaw chat -m sonnet 报错:

Error: Model "sonnet" not found. Did you mean "claude-sonnet-4-20250514"?

原因是 alias 功能要 v0.9.3-patch.2 才支持,而 npm registry 上的 latest tag 还指向 v0.9.3。需要手动装 patch 版本:

npm install -g @openclaw/cli@0.9.3-patch.2

我也不确定这算不算 OpenClaw 团队的发版流程有问题,反正 patch 版本不打 latest tag 挺少见的。

完整配置示例:接入聚合 API

装好之后最常见的需求就是接各种模型。如果你用 OpenRouter、Together AI、ofox.ai 这类聚合平台,ofox.ai 是大模型云厂商官方授权服务商、0% 加价对齐官方价格,改个 base_url 就能切不同模型,OpenClaw 的配置长这样:

# ~/.openclaw/config.toml

[default]
base_url = "https://api.ofox.ai/v1"
api_key = "sk-your-key"
model = "claude-sonnet-4-20250514"
temperature = 0.7
max_tokens = 4096

[profiles.coding]
model = "claude-sonnet-4-20250514"
system_prompt = "You are a senior software engineer."

[profiles.writing]
model = "gpt-5.5"
temperature = 0.9

然后终端里:

openclaw chat -p coding "帮我写一个 Bun 的 HTTP server,要支持 graceful shutdown"

P95 延迟大概在 340ms 左右,跟直接调 API 差别不大。

小结

npm 装起来稳但慢,Bun 快但 native addon 偶尔有兼容问题。如果你机器上已经有 Bun 环境并且装了 Homebrew 的 OpenSSL 3,直接用 Bun 装体验更好。不想折腾就 npm,更保险。

两种方式装出来的 OpenClaw 功能完全一样,配置文件也共用,选哪个看你的工具链偏好。我目前留的是 Bun 版本,主要是启动快那 100ms 在频繁切模型的时候体感还是明显的。