OpenClaw npm 升级踩坑记:从版本冲突到模块丢失

温馨提醒
总结摘要
一次升级引发的连环问题,记录从版本冲突到模块导入错误的完整排查过程

一次升级引发的连环问题,记录从版本冲突到模块导入错误的完整排查过程。

问题版本

  • 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
  • 但目标文件不存在或路径不对
  • 这是典型的 构建产物丢失 问题

可能原因:

  1. npm 安装过程中文件未完整下载
  2. 版本更新时构建缓存损坏
  3. 系统级与用户级安装冲突导致文件覆盖异常

完整时间线

时间事件说明
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.12sudo npm install -g (系统级)高 (/usr/bin)
~/.npm-global/lib/node_modules/openclaw/2026.4.14npm 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 安装过程中构建产物未完整生成

  1. Hash 文件名机制

    • OpenClaw 使用 Rollup/Vite 等工具构建
    • 输出文件名包含内容哈希(如 commands-registry.runtime-B_2dt-RL.js
    • 不同版本哈希值不同
  2. 文件覆盖冲突

    • 系统级和用户级安装可能互相干扰
    • 旧版本的 .js 文件引用新版本的哈希文件
    • 但新版本文件未正确生成
  3. npm 缓存问题

    • npm 可能使用缓存的旧构建产物
    • 导致文件不完整或版本不匹配

相关 GitHub Issues

Issue描述状态
#46521 openclaw update silently fails when a system-level install shadows the user-global installOpen
#66390 [macOS] Gateway fails to start after openclaw update due to file lock conflictsOpen
#61686 2026.4.5 npm update/install can leave CLI brokenOpen
#27583 Linux npm-global update can leave partial installOpen
#65471 Update logic changes in 2026.4.12Open

解决方案

第一阶段:解决版本冲突

方案 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"

然后:

1
source ~/.bashrc

方案 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. 早期手动安装

    1
    
    sudo npm install -g openclaw

    (可能因为当时用户级安装权限问题)

  2. 系统初始化脚本

    • 某些 VPS 镜像预装的脚本
    • Docker 容器构建脚本
  3. 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();
  
  // 但没有检测系统级/用户级双安装
}

经验教训

  1. 避免混用系统级和用户级安装

    • 选择一种方式并坚持使用
    • 推荐用户级安装(无需 root 权限)
    • 永远不要同时用 sudo npm install -gnpm install -g
  2. 升级前检查环境状态

    • 记录当前版本
    • 检查安装位置
    • 备份重要配置
  3. 理解 PATH 优先级

    • which 命令显示的是第一个匹配的可执行文件
    • 可能有多个版本同时存在
  4. 模块错误 = 重新安装

    • 遇到 Cannot find module 错误不要试图手动修复
    • 直接 npm cache clean --force && npm install -g --force
    • 让 npm 重新构建所有文件
  5. 关注官方 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