Skip to content

[hub] bun-only 机器通过 hub start 前置检查后 spawn bunx 失败,且报错归因错误(守卫 OR / 需求 bunx-only) #766

Description

@vansin

事实

装了 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,所以走那条路的人不会踩到 ——
但我们恰恰刚刚在把各处从那条路改成更安全的方式,这个坑因此会更常见,不是更少见。

#744 / #761 / #764 的关系(我自己那条线的修正)

我在 #761/#764anet -v 的探测对齐到了这道守卫(bunx 或 bun)。
现在看,守卫本身就是错的:bun-only 的机器上,anet -v 会显示

Required to run a hub on this machine:
  ✓ Bun v1.3.14

anet hub start 仍然会失败。我把自报对齐到了一个不正确的基准。

建议(两条,可分别做)

  1. 守卫改为反映真实需求:检查 bunx(或改 spawn 为 bun x / 直接 bun),让前置检查与 spawn 同源;
  2. 报错文案改掉归因:不要说 "disappeared from PATH",应当说
    「找到了 bun 但没有 bunx;bunx 通常由官方安装器创建,可 ln -s $(command -v bun) …/bunx
    或用 npm i -g bun」。

第 2 条即使第 1 条不做也值得单独做 —— 当前文案会让人去查 PATH 和「谁卸载了 bun」,
而真因是这台机器从来没有过 bunx

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions