Repository navigation
Replies: 2 comments
|
能被离线判出来,而且这个输入也照出了我们自己的同一个错判——两边都值得记一下。 一、判据本身很简单,缺的只是有人把它写下来。 BOM 对 你说的"报错不指向病因"有两个叠加原因,值得分开:
我们把这一条做成了检查( # PowerShell 5.1 的 -Encoding UTF8 默认写 BOM,改用:
[IO.File]::WriteAllText($p, (Get-Content $p -Raw), (New-Object Text.UTF8Encoding $false))二、我们此前在同一个输入上给出了错误结论。 我们的诊断工具也读这个 manifest,写法是: const manifest = JSON.parse(readFileSync(manifestPath, 'utf8')); // 带 BOM 时抛错 → 整段"检查异常"
// 另一处:try { ... } catch { profManifest = null } → P18 报"未找到 profile manifest"也就是说——用户的 profile 起不来,而我们的工具要么自己崩、要么告诉他"这个文件不存在"。对一个诊断工具来说这是最糟的失败方式:它被它要诊断的那份输入打败了。现在所有 manifest 读取改成带 BOM 感知:剥掉 BOM 后继续工作,把"有没有 BOM"单独交给 P22 报出。这样即使 profile 因为 BOM 起不来,其余 20 多项检查仍然能给出结论——包括那些与 BOM 无关的真实问题。 三、给你的一个附带好处:这类"文件看起来没问题、但序列化层不接受"的坑通常不止一处。如果你身边还有别的 JSON 清单是脚本生成的(例如某个工具的配置文件),值得顺手确认它们的编码——BOM 在 Windows 上尤其容易从 PowerShell 5.1、 |
|
更正我上一条回复里的一个说法,同时把真实的失败讲清楚——后者对这条线程更有用。 我说错的地方:我写"我们把这一条做成了检查(P22)……补的正是报错不指向病因缺的那一句"。不对。 也就是说——诊断一直都在,是我没查自己的清单就新加了一条重复的。这条已经撤掉了(#6758 特有的信息——PowerShell 5.1 的 而真实的失败其实更有意思,也更值得记:在修复之前,你那种 profile 上我们的工具根本走不到 P15。因为主读取点是直接 P15 没有机会执行。 所以这不是"我们缺一条检查",而是"一条正确的检查被上游一个无关故障静默了"。"有检查"和"用户看得到"是两件事——这个区别我此前没有当成一回事,今天它咬了两次(另一次是变量作用域错误掐掉整段)。 因此这轮改了三件事(
还欠着的:环境段仍有 10 项没报告覆盖量( 最后一句给你:你这条报告改掉的不只是一条检查,而是我们造检查的方式——它让我意识到我们前几轮修的每一个 bug(判错视图、成片误报、假绿灯、重复检查)根因都相同:用一个"看起来合理"的模型,代替了权威来源。原则只有落成机制才算数,写在文档里就只剩运气。 |
Uh oh!
There was an error while loading. Please reload this page.
环境
@deepseek-ai/dsh-app-boot@0.1.5-rc.2现象
profile 的清单
~/.dsh/profiles/<name>/package.json只要带 UTF-8 BOM(EF BB BF),DSH 就再也起不来,直接硬失败退出。控制台只留下这样一条:GBK 控制台把 BOM 那三个字节渲染成了「锘縶」,报错信息里看不出是编码问题。
复现
无 BOM 写回即可恢复:
原因
readProfileManifest()读文件后直接JSON.parse,没有剥掉开头的 U+FEFF:同一文件里还有几处读 package.json 后直接 parse 的写法,都会因为 BOM 走到硬失败或静默失败:
readModuleProxyRecord:抛错被catch吞掉,模块代理记录静默变成 undefinedreadModuleFallbackManifest:直接抛错dsh.bundle.patch声明:直接抛错也就是说任一 package.json 被外部工具写成带 BOM,都可能在引导期变成启动失败。
建议
在统一读 JSON 的位置去掉前导 BOM,例如
JSON.parse(raw.replace(/^\uFEFF/, '')),或抽一个小 helper 复用。顺带把错误信息补一句「文件可能带 BOM」,现在这条报错完全看不出病因。影响
不涉及安全与数据损坏,但代价不对等。Windows 上 PowerShell 5.1 的
Set-Content -Encoding UTF8、Out-File -Encoding UTF8,以及部分编辑器另存为 UTF-8 时默认都带 BOM;用户一旦用这些工具碰过 profile 清单,DSH 就启动不了,而报错不指向病因,只能靠手工排查字节。DSH 自己写回清单(writeProfileManifest,763 行)是无 BOM 的,所以问题只在外部编辑之后出现。(这条是我在做插件启动失败路径自测时踩到的,附的报错就是当时的原始输出。)
All reactions