总结摘要
一次升级引发的连环问题,记录从版本冲突到模块导入错误的完整排查过程
一次升级引发的连环问题,记录从版本冲突到模块导入错误的完整排查过程。
问题版本
- OpenClaw: 2026.4.12 → 2026.4.14 → 2026.4.15
- 环境: Linux (Ubuntu/Debian)
- 安装方式: npm global install
- 关键词: npm prefix, global install, PATH priority, 模块丢失,安装冲突
问题现象
第一阶段:版本不一致
执行 openclaw update 从 2026.4.12 升级到 2026.4.14 后,出现以下异常:
1
2
3
4
5
6
7
8
| $ openclaw --version
OpenClaw 2026.4.12 (1c0672b) # 预期是 2026.4.14
$ /home/chang/.npm-global/bin/openclaw --version
OpenClaw 2026.4.14 (323493f) # 这个才是正确的
$ /usr/bin/openclaw --version
OpenClaw 2026.4.12 (1c0672b) # 旧版本
|
核心问题: CLI 命令显示旧版本,但实际新版本已安装到我的用户目录。
第二阶段:模块导入错误
解决版本冲突后,又遇到新的报错:
1
| 抱歉,处理请求时出错:Cannot find module '/home/chang/.npm-global/lib/node_modules/openclaw/dist/commands-registry.runtime-B_2dt-RL.js' imported from /home/chang/.npm-global/lib/node_modules/openclaw/dist/get-reply-Bt3IWYIA.js
|
错误含义:
- OpenClaw 内部文件
get-reply-Bt3IWYIA.js 试图导入 commands-registry.runtime-B_2dt-RL.js - 但目标文件不存在或路径不对
- 这是典型的 构建产物丢失 问题
可能原因:
- npm 安装过程中文件未完整下载
- 版本更新时构建缓存损坏
- 系统级与用户级安装冲突导致文件覆盖异常
完整时间线
| 时间 | 事件 | 说明 |
|---|
| 2026.4.12 之前 | 只有 ~/.npm-global/ 安装 | openclaw update 工作正常 |
| 2026-04-14 02:36 | /usr/bin/openclaw 系统级软链被创建 | 可能是手动 sudo npm install -g 或脚本 |
| 2026-04-16 22:40 | 执行 openclaw update | 从 4.12 升级到 4.14 |
| 2026-04-16 22:42 | 出现模块导入错误 | 构建产物丢失,需重新安装 |
| 2026-04-16 22:45 | 发现版本不一致 | CLI 显示 4.12,实际 4.14 已安装到用户目录 |
| 2026-04-17 00:37 | 移动 /usr/bin/openclaw 为 .bak | 版本问题解决 |
排查过程
第一步:确认安装位置
1
2
3
4
5
6
7
8
| $ whereis openclaw
openclaw: /usr/bin/openclaw /home/chang/.npm-global/bin/openclaw
$ ls -lah /usr/bin/openclaw
lrwxrwxrwx 1 root root 41 Apr 14 02:36 /usr/bin/openclaw -> ../lib/node_modules/openclaw/openclaw.mjs
$ ls -lah /home/chang/.npm-global/bin/openclaw
lrwxrwxrwx 1 chang chang 41 Apr 16 22:45 /home/chang/.npm-global/bin/openclaw -> ../lib/node_modules/openclaw/openclaw.mjs
|
发现: 系统中有两个 openclaw 可执行文件,PATH 中 /usr/bin 优先级更高。
第二步:检查实际包版本
1
2
3
4
5
6
7
8
9
| $ npm list -g openclaw
/home/chang/.npm-global/lib
└── [email protected]
$ cat /home/chang/.npm-global/lib/node_modules/openclaw/package.json | grep '"version"'
"version": "2026.4.14"
$ cat /usr/lib/node_modules/openclaw/package.json | grep '"version'"
"version": "2026.4.12"
|
确认: 用户级目录是 4.14,系统级目录是 4.12。
第三步:验证网关服务状态
1
2
3
4
5
6
7
| $ systemctl --user status openclaw-gateway.service
● openclaw-gateway.service - OpenClaw Gateway (v2026.4.14)
Active: active (running)
$ systemctl --user status openclaw-gateway-rescue.service
● openclaw-gateway-rescue.service - OpenClaw Gateway (profile: rescue, v2026.4.14)
Active: active (running)
|
网关正常: 两个 gateway 服务都在运行 2026.4.14,说明升级本身是成功的。
根本原因
问题一:双安装并存
系统中同时存在两个 OpenClaw 安装:
| 安装位置 | 版本 | 创建方式 | PATH 优先级 |
|---|
/usr/lib/node_modules/openclaw/ | 2026.4.12 | sudo npm install -g (系统级) | 高 (/usr/bin) |
~/.npm-global/lib/node_modules/openclaw/ | 2026.4.14 | npm install -g (用户级) | 低 (~/.npm-global/bin) |
问题二:openclaw update 的行为
2026.4.12 之前:
- 直接调用
npm update -g openclaw - npm 根据当前用户的
prefix 配置决定安装位置 - 单一安装场景下工作正常
2026.4.12 及之后:
- 引入新的
runPackageInstallUpdate 函数 (
#65471
) - 修改了更新入口点和插件刷新逻辑
- 但仍然只更新用户级安装,不检测系统级安装
问题三:PATH 优先级问题
1
2
3
4
5
6
| $ echo $PATH | tr ':' '\n' | head -5
/usr/local/sbin
/usr/local/bin
/usr/bin # ← /usr/bin/openclaw 优先
/home/chang/.npm-global/bin # ← 用户级在后
...
|
当执行 openclaw 时,shell 首先找到 /usr/bin/openclaw,指向系统级 4.12 版本。
问题四:构建产物丢失
模块导入错误的根本原因是 npm 安装过程中构建产物未完整生成:
Hash 文件名机制
- OpenClaw 使用 Rollup/Vite 等工具构建
- 输出文件名包含内容哈希(如
commands-registry.runtime-B_2dt-RL.js) - 不同版本哈希值不同
文件覆盖冲突
- 系统级和用户级安装可能互相干扰
- 旧版本的
.js 文件引用新版本的哈希文件 - 但新版本文件未正确生成
npm 缓存问题
- npm 可能使用缓存的旧构建产物
- 导致文件不完整或版本不匹配
相关 GitHub Issues
| Issue | 描述 | 状态 |
|---|
| #46521
| openclaw update silently fails when a system-level install shadows the user-global install | Open |
| #66390
| [macOS] Gateway fails to start after openclaw update due to file lock conflicts | Open |
| #61686
| 2026.4.5 npm update/install can leave CLI broken | Open |
| #27583
| Linux npm-global update can leave partial install | Open |
| #65471
| Update logic changes in 2026.4.12 | Open |
解决方案
第一阶段:解决版本冲突
方案 A:移除系统级安装(推荐)
1
2
3
4
5
6
7
8
9
| # 1. 备份并移除系统级软链
sudo mv /usr/bin/openclaw /usr/bin/openclaw.bak
# 2. 验证
which openclaw
# 应该输出:/home/chang/.npm-global/bin/openclaw
openclaw --version
# 应该输出:OpenClaw 2026.4.14
|
方案 B:卸载系统级 npm 包
1
2
3
4
5
6
| # 用 sudo 卸载系统级全局包
sudo npm uninstall -g openclaw
# 验证
which openclaw
openclaw --version
|
方案 C:调整 PATH 顺序
在 ~/.bashrc 或 ~/.zshrc 中添加:
1
| export PATH="$HOME/.npm-global/bin:$PATH"
|
然后:
方案 D:添加别名(最简单)
在 ~/.bashrc 中添加:
1
| alias openclaw="$HOME/.npm-global/bin/openclaw"
|
第二阶段:解决模块导入错误
如果解决版本冲突后仍出现模块导入错误,说明安装不完整:
方案 1:强制重新安装(推荐)
1
2
3
4
5
6
7
8
9
| # 清除 npm 缓存
npm cache clean --force
# 强制重新安装
npm install -g openclaw --force
# 验证安装
openclaw --version
openclaw status
|
方案 2:完全卸载后重装
1
2
3
4
5
6
7
8
9
10
11
| # 卸载用户级安装
npm uninstall -g openclaw
# 清理残留
rm -rf ~/.npm-global/lib/node_modules/openclaw
# 重新安装
npm install -g openclaw
# 验证
openclaw --version
|
方案 3:检查安装完整性
1
2
3
4
5
| # 检查 dist 目录是否完整
ls -la /home/chang/.npm-global/lib/node_modules/openclaw/dist/
# 应该有 commands-registry.runtime-*.js 和 get-reply-*.js 等文件
# 如果文件缺失,说明安装不完整
|
为什么会发生在我身上?
可能的系统级安装来源
早期手动安装
1
| sudo npm install -g openclaw
|
(可能因为当时用户级安装权限问题)
系统初始化脚本
- 某些 VPS 镜像预装的脚本
- Docker 容器构建脚本
npm prefix 配置变化
1
2
3
4
| # 检查当前 prefix
npm config get prefix
# 如果返回 /usr,则安装会到系统级
|
为什么 4.12 之前没问题?
- 4.12 之前只有用户级安装,不存在双安装冲突
- 4.12 引入了新的更新逻辑 (
#65471
),但没有增加双安装检测
- 4.12 到 4.14 的升级暴露了这个问题
预防措施
1. 统一安装方式(最重要)
强烈建议只使用用户级安装:
1
2
3
4
5
6
7
8
9
| # 配置 npm 用户级 prefix
npm config set prefix "$HOME/.npm-global"
# 添加到 shell 配置
echo 'export PATH="$HOME/.npm-global/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
# 之后所有安装都用普通用户权限
npm install -g <package>
|
避免使用 sudo npm install -g,除非明确知道为什么需要系统级安装。
2. 检查当前安装状态
1
2
3
4
5
6
7
8
9
10
11
12
| # 检查所有 openclaw 可执行文件
whereis openclaw
# 检查 npm 全局包
npm list -g openclaw
sudo npm list -g openclaw # 检查系统级
# 检查 npm prefix
npm config get prefix
# 检查安装完整性
ls /home/chang/.npm-global/lib/node_modules/openclaw/dist/ | head -10
|
3. 升级前检查
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| # 升级前记录当前版本
openclaw --version
# 检查是否有系统级安装
ls -la /usr/bin/openclaw 2>/dev/null
# 执行升级(或重新安装)
openclaw update
# 或直接:npm install -g openclaw
# 升级后验证
openclaw --version
which openclaw
openclaw status
|
4. 遇到模块错误时的快速修复
1
2
| # 一键修复脚本
npm cache clean --force && npm install -g openclaw --force && openclaw status
|
如果还有问题,检查 gateway 服务:
1
2
3
4
5
| # 重启 gateway
openclaw gateway restart
# 检查服务状态
systemctl --user status openclaw-gateway.service
|
技术细节
npm 全局安装的两种模式
| 模式 | 命令 | 安装位置 | 权限要求 |
|---|
| 系统级 | sudo npm install -g | /usr/lib/node_modules/ | root |
| 用户级 | npm install -g | ~/.npm-global/lib/node_modules/ | 当前用户 |
PATH 搜索顺序
1
2
3
4
5
6
7
8
| $ echo $PATH | tr ':' '\n'
/usr/local/sbin
/usr/local/bin
/usr/bin # ← 系统级 bin 优先
/usr/sbin
/sbin
/bin
/home/chang/.npm-global/bin # ← 用户级 bin 在后
|
OpenClaw 更新逻辑(4.12+)
1
2
3
4
5
6
7
8
9
10
11
12
13
| // 简化版 runPackageInstallUpdate
async function runPackageInstallUpdate() {
// 1. 检测安装模式
const isGlobal = await detectGlobalInstall();
// 2. 执行 npm 更新
await exec('npm install -g openclaw@latest');
// 3. 刷新插件入口点 ([#65471](https://github.com/openclaw/openclaw/issues/65471))
await respawnPluginRefresh();
// 但没有检测系统级/用户级双安装
}
|
经验教训
避免混用系统级和用户级安装
- 选择一种方式并坚持使用
- 推荐用户级安装(无需 root 权限)
- 永远不要同时用
sudo npm install -g 和 npm install -g
升级前检查环境状态
理解 PATH 优先级
which 命令显示的是第一个匹配的可执行文件- 可能有多个版本同时存在
模块错误 = 重新安装
- 遇到
Cannot find module 错误不要试图手动修复 - 直接
npm cache clean --force && npm install -g --force - 让 npm 重新构建所有文件
关注官方 Issue 追踪
故障排除命令清单
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| # 1. 检查 CLI 版本
openclaw --version
# 2. 检查实际安装位置
which openclaw
whereis openclaw
# 3. 检查 npm 全局包
npm list -g openclaw
# 4. 检查 gateway 服务
systemctl --user status openclaw-gateway.service
# 5. 检查 gateway 实际运行版本
ps aux | grep openclaw-gateway
# 6. 检查 npm prefix
npm config get prefix
# 7. 检查所有 openclaw 可执行文件
find /usr -name "openclaw*" 2>/dev/null
find ~ -name "openclaw*" 2>/dev/null
|
参考资料
快速修复命令(收藏这个)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| # 完整修复流程
# 1. 移除系统级安装
sudo mv /usr/bin/openclaw /usr/bin/openclaw.bak 2>/dev/null
# 2. 清理缓存
npm cache clean --force
# 3. 强制重装
npm install -g openclaw --force
# 4. 验证
openclaw --version
openclaw status
# 5. 重启 gateway
openclaw gateway restart
|