Skip to content

1.2.0

Choose a tag to compare

@SuCriss SuCriss released this 18 Sep 03:29
· 18 commits to main since this release

dsh-version-update 1.2.0

安装过程第一次有了可看的进度,源下载慢时有退路,安装前有本地预检,失败后能恢复回它替换掉的那个版本。

关于版本号:本 tag 指向 fdf74f7(把快照管理与重启诊断那条分支并回主线的合并提交,
也是这批功能真正落地的地方),但该提交的 package.json 仍写着 1.1.8 ——
版本号是连同 1.3.0 一起在 7688b85 里提交的,1.2.0 从未作为一次单独的提交存在过。
需要装这个版本的话请以 tag 为准,不要以 manifest 里的版本字符串为准。

新增

  • 安装卡从滚动的日志变成进度条。 npm 在抓取阶段什么都不打印、目录也不动,面板此前只能显示一行快照然后就沉默。宿主现在把一次运行建模成 preparing → snapshot → download → extract → done,并且只度量它真能度量的东西:快照自身的字节与文件数、安装树的字节数(以快照的实测大小作分母)、以及 npm 自己的缓存暂存文件 _cacache/tmp(按 npm 自己的解析方式定位)作为"下载确实在动"的唯一证据。没有分母时进度条故意是不确定的,只显示看到的字节,绝不给出它支撑不了的百分比;一个没有信号的阶段被当作 blind 而不是"卡住",因为"没有信号"和"没有变化"是两件不同的事。npm 的输出仍然收集——那是让一次运行看起来还活着的东西——但退到「显示详细日志」开关后面,不再往用户脸上推。
  • 备用安装源(淘宝镜像)。 POST /update 接受可选的 source:auto / official / mirror,在确认卡上选;auto 继续跟随真正服务了版本读取的那个 registry。宿主永不接受来自浏览器的 URL——地址写在入口配置里(registry,以及新增的 mirrorRegistry,默认 https://registry.npmmirror.com),不是这三个标识符之一一律 400。一次运行 30 秒没有可测进展会说明并点名镜像作为下一步,但不中断它:在 reify 中途杀掉 npm 正是留下半提交树的原因。落定之后失败卡提供一键用镜像重试同一版本。
  • 安装前的本地预检。 确认卡读取 GET /preflight(npm 可解析、安装父目录可写、磁盘余量、快照存储可用),在用户还在决定时就把答案摆在面前。每项检查都降级为警告而不是拒绝,并且不跑 npm、不碰网络——它是建议,不是闸门。
  • 本宿主运行做过什么的活动时间线。 安装、恢复与修复保留在有界的内存日志里(最新 200 条),经 GET /operations?since=N 与一个单调游标提供,面板因此是追加而不是重读。宿主重载即重置,并且一次安装只记录它的落定——绝不记一个编造的开始。
  • 等待中的自动任务可以取消。 POST /pending/cancel 解除一个泊车的自动安装及其窗口唤醒 / busy 重试,且不碰策略与每日检查;面板显示目标版本与它是什么时候被排入的。
  • snapshotMaxBytes 给快照存储设上限。 一次成功创建之后,先清损坏的与超出保留数的,再从最旧可用的开始清,直到存储符合配额——刚做出来的那个快照永远存活,即使它自己就超了配额。
  • 失败的安装恢复它替换掉的那个版本。 修复路径接受 preferredVersion——那次运行开始时的版本——并恢复那个确切的快照,而不是"最新的那个快照"。调用方知道用户跑的是哪个版本,而安装本身出问题的时候,最新恰恰是错的答案。

变更

  • 安装前快照变成强制项。 requireSnapshot(默认 true)让写不出快照的安装在 spawn npm 之前就中止(FatalPreparationError),而不是记一行日志跨过去——一次没有回滚点的安装,恰恰是那种可能让用户手上一个能跑的版本都不剩的安装。要回到旧的尽力而为行为就设成 false。
  • 树修复把"起不来的树"当作损坏。 只有 manifest 从来不够——一次被中断的安装可以留下一个能解析、但 lib/bin.js 已经没了的树——所以 inspectTreeHealth 现在报告 launcherOk,并且每一轮修复都要求它,不只是失败之后那一轮。recent-retirement 保护是让这个检查不至于和还在写盘的 npm 抢跑的东西。

测试

234 用例通过,tsc --checkJs 干净。

Full Changelog: v1.1.8...v1.2.0