Skip to main content
Zhimalab
中文
This article is not yet available in English. View the Chinese version

10 分钟修好装不上的 Bun:一枚失效的 shim 与一次被救回的安装

2026-08-27 · 7 min

背景

要在 Windows 上用 bun,却发现本机 bun 是坏的。朋友自己折腾了 30 分钟、重试了两次都没搞定。我接手后 10 分钟内解决。这篇记录的不是“装 bun 的步骤”,而是为什么前面两次都失败、以及如何快速定位真正的问题

症状:bun 明明“存在”,却跑不起来

$ bun --version
/c/Users/peini/AppData/Local/pnpm/bun: line 17: C:\Users\peini\AppData\Local\pnpm/global/5/.pnpm/bun@1.4.0/node_modules/bun/bin/bun.exe: No such file or directory

关键信息不在 bun 这两个字,而在后面那一整串路径。这个报错翻译成人话是:

有个脚本(shim)想帮你启动 bun.exe,但这个 .exe 文件已经不在了。

定位:这不是 bun 的问题,是 pnpm 的问题

顺着报错路径逐层确认:

  1. which bun/c/Users/peini/AppData/Local/pnpm/bun,说明 bun 是一个 pnpm 全局 shim 脚本,不是真正的可执行文件;
  2. 打开这个脚本,第 17 行去执行 global/5/.pnpm/bun@1.4.0/node_modules/bun/bin/bun.exe —— 这个 .exe 已经不存在;
  3. pnpm rm -g bun 报错 ERR_PNPM_CANNOT_REMOVE_MISSING_DEPS —— 包早就被移除了,但 6 个 shim 文件残留bun/bunx 各 3 个:无后缀、.CMD.ps1),外加 pnpm store 里的 @oven+bun-windows-x64@1.4.0 残留目录。

pnpm(npm 也一样)全局安装的“命令”,本质是 node_modules 里的一个包 + 一层 shim 脚本。 包删了、shim 没删,命令就变成一具空壳——which 能找到它,一执行就报“找不到文件”。

为什么重装两次还是失败

如果用 pnpm add -g bun 重装,装的还是同一个 global 目录:

  • 旧的坏 shim 如果还排在 PATH 前面,which bun 依旧命中坏壳,看起来“装了还是不行”;
  • 即便 shim 被覆盖,只要 store 路径里的 .exe 始终没正确落地,报错一字不差。

重装前先确认“清理干净”、重装后再确认“which 指向了新二进制“,否则就是在同一个坑里反复跳。

清理残留

cd /c/Users/peini/AppData/Local/pnpm
rm -f bun bun.CMD bun.ps1 bunx bunx.CMD bunx.ps1
rm -rf global/5/.pnpm/@oven+bun-windows-x64@1.4.0

官方安装器:卡死了,但别急着关

用 bun 官方安装器(Windows 推荐 PowerShell 方式):

powershell -NoProfile -ExecutionPolicy Bypass -Command "irm bun.sh/install.ps1 | iex"

跑了 120 秒超时。但检查 ~/.bun/bin,发现目录里已经有东西了:

bun-windows-x64.zip   # 25MB,下载完成但还没解压
bunx.exe              # 88MB,完整可用的 PE 可执行文件

安装器卡死 ≠ 安装失败。先看看它到底完成了多少——很多安装器是边下边生效的,半途超时的那份可能已经把关键文件落地了。与其傻等,不如检查半成品。

妙手:bunx.exe 就是 bun.exe

bun 的 Windows 发行包里,bun.exebunx.exe同一个二进制,靠被调用的文件名(argv[0])决定以 bun 还是 bunx 模式运行。所以既然 bunx.exe 完整落地,完整的 bun 二进制就已经到手了:

cd ~/.bun/bin
cp bunx.exe bun.exe          # 复制出一份 bun
rm -f bun-windows-x64.zip    # 损坏的 zip,删掉(被 Defender 占用就重启后再删,不影响使用)

验证

$ bun --version
1.4.0

$ bun add cowsay             # 真实装一个包,验证 npm registry 链路
33 packages installed [6.54s]

bun 命令恢复正常,包安装也通了。

复盘:10 分钟 vs 30 分钟,差在哪

  1. 读全报错信息。报错里那串路径就是答案,别停在“bun 用不了”这句表象上;
  2. 分图层定位。命令(shim)→ 二进制(.exe)→ 运行时,逐层确认到底哪一层断了;
  3. 重装前先清场。残留 shim 会让重装“看起来失败”,其实只是旧壳挡路;
  4. 安装器卡住先看半成品bunx.exe 已经落地,就不需要从头再来。

最后一点建议:如果之前是用 pnpm add -g bun 装的,后续更新建议改用官方安装器(装到 ~/.bun/bin)并配合 bun upgrade,避免再踩 pnpm 全局 shim 的坑。