事实
装了 bun 但没有 bunx 的机器上,anet hub start 会通过自己的前置检查,
然后在 spawn 处失败,并给出一条把人引向错误方向的报错。
❌ Failed to spawn bunx — it disappeared from PATH after the preflight check.
This usually means Bun was uninstalled or PATH changed mid-process.
bunx 从来就没在过 —— 不是「中途消失」。
源码:守卫与实际需求不一致
// cli.ts:5707 —— 前置检查:任一存在即放行
if (!commandExists("bunx") && !commandExists("bun")) { … process.exit(1); }
// cli.ts:5734 —— 实际 spawn:只认 bunx
child = spawn("bunx", serverArgs, { env, stdio: "inherit" });
// cli.ts:5737 —— 失败文案:归因于 PATH 中途变化
console.error(`❌ Failed to spawn bunx — it disappeared from PATH after the preflight check.`);
守卫是 OR,需求是 bunx only。两者不一致,所以 bun-only 的机器必然走到 spawn 失败。
复现(干净容器,解耦对照)
FROM node:22-bookworm-slim
# 从 GitHub release zip 装 bun —— 这个 zip 里**只有 bun,没有 bunx**
curl … bun-linux-x64.zip → unzip -j 'bun-linux-x64/bun' -d /usr/local/bin
容器内: bun → /usr/local/bin/bun
bunx → (不存在)
anet hub start → ❌ Failed to spawn bunx … /health 不通
只加一条软链,其它一律不动:
ln -s /usr/local/bin/bun /usr/local/bin/bunx
anet hub start → /health 返回 {"ok":true,"version":"0.9.0-preview.29", …}
单一变量,结论明确。
这个场景有多现实
- 从 GitHub release zip 装 bun(不少 Dockerfile 这么做,包括本仓最近新增的镜像)——
zip 里只有 bun;
- 任何手工/二进制安装。
官方 curl bun.sh/install | bash 会建 bunx,所以走那条路的人不会踩到 ——
但我们恰恰刚刚在把各处从那条路改成更安全的方式,这个坑因此会更常见,不是更少见。
我在 #761/#764 把 anet -v 的探测对齐到了这道守卫(bunx 或 bun)。
现在看,守卫本身就是错的:bun-only 的机器上,anet -v 会显示
Required to run a hub on this machine:
✓ Bun v1.3.14
而 anet hub start 仍然会失败。我把自报对齐到了一个不正确的基准。
建议(两条,可分别做)
- 守卫改为反映真实需求:检查
bunx(或改 spawn 为 bun x / 直接 bun),让前置检查与 spawn 同源;
- 报错文案改掉归因:不要说 "disappeared from PATH",应当说
「找到了 bun 但没有 bunx;bunx 通常由官方安装器创建,可 ln -s $(command -v bun) …/bunx
或用 npm i -g bun」。
第 2 条即使第 1 条不做也值得单独做 —— 当前文案会让人去查 PATH 和「谁卸载了 bun」,
而真因是这台机器从来没有过 bunx。
事实
装了
bun但没有bunx的机器上,anet hub start会通过自己的前置检查,然后在 spawn 处失败,并给出一条把人引向错误方向的报错。
bunx从来就没在过 —— 不是「中途消失」。源码:守卫与实际需求不一致
守卫是 OR,需求是 bunx only。两者不一致,所以 bun-only 的机器必然走到 spawn 失败。
复现(干净容器,解耦对照)
只加一条软链,其它一律不动:
单一变量,结论明确。
这个场景有多现实
zip 里只有
bun;官方
curl bun.sh/install | bash会建bunx,所以走那条路的人不会踩到 ——但我们恰恰刚刚在把各处从那条路改成更安全的方式,这个坑因此会更常见,不是更少见。
与 #744 / #761 / #764 的关系(我自己那条线的修正)
我在 #761/#764 把
anet -v的探测对齐到了这道守卫(bunx 或 bun)。现在看,守卫本身就是错的:bun-only 的机器上,
anet -v会显示而
anet hub start仍然会失败。我把自报对齐到了一个不正确的基准。建议(两条,可分别做)
bunx(或改 spawn 为bun x/ 直接bun),让前置检查与 spawn 同源;「找到了
bun但没有bunx;bunx通常由官方安装器创建,可ln -s $(command -v bun) …/bunx或用
npm i -g bun」。第 2 条即使第 1 条不做也值得单独做 —— 当前文案会让人去查 PATH 和「谁卸载了 bun」,
而真因是这台机器从来没有过
bunx。