v0.8.6
0.8.6 (2026-08-24)
🛠️ CI / Build
- preflight: 检查 minimumReleaseAge 豁免 —— 发了 6 个版本本机一个都装不上 (d2be33f)
详细说明 —— 每条改动的现象 / 根因 / 实测数字(1 条)
ci(preflight): 检查 minimumReleaseAge 豁免 —— 发了 6 个版本本机一个都装不上
当天连发 0.8.0 → 0.8.5,本机 web profile 却始终装着旧版:
dsh plugin up @pkg@latest 装上的是 0.4.0,pnpm update 装 0.8.1,
每条命令都成功退出、就是拿不到最新。
先怀疑 npmmirror 镜像没同步 —— 查完发现 registry 是官方 registry.npmjs.org,
而且官方和镜像的 dist-tags.latest 都是 0.8.5,npm view / pnpm view 三处都对。
元数据没问题,pnpm 就是不装它。
根因:profile 的 pnpm-workspace.yaml 里躺着
minimumReleaseAgeExclude:
- '@kubor/dsh-bloom-theme@0.3.4'
minimumReleaseAge 是 pnpm 11 默认开启的供应链安全特性:不装发布不足 24h 的版本。
对照发布时间一目了然 —— 0.4.0 是 26.2h 前(通过),0.8.00.8.5 是 1.53.7h 前
(全被拦),于是 pnpm 静默回退到唯一够老的 0.4.0。而豁免写的是带版本号的
@0.3.4,只豁免那一个版本,所以每发一次新版都重新被挡。
这也解释了另一件长期没搞懂的事:profile 声明为什么一直停在 ^0.3.4 ——
每次升级尝试都被这道墙挡回去了。
修法:豁免去掉版本号(作者就是本机用户,风险为零)。另注意 pnpm 的 packument
缓存 —— 改完 up @latest 仍会装成 0.8.1,显式 add @pkg@0.8.5 才一次到位。
preflight 第 5 组加检查:豁免写成带版本号的形式直接判失败,并提示去掉 @x.y.z;
link:/file: 的本地声明不走 registry,自动跳过(desktop profile 就是这种)。
DEV_NOTES 记两条教训:
· 「安全特性静默降级」是最难查的一类故障 —— 命令成功、退出码 0、装上一个
能用 的旧版本,没有任何一处说「你要的版本被策略挡了」。查这类问题要直接
对照两边事实(registry 有什么 / 本地装了什么),而不是顺着命令输出找。
· 豁免/白名单/忽略项一律不带版本号。带了等于「只豁免这一次」。这跟范围白名单
的思路正好相反:白名单要精确(防外扩),豁免要宽泛(防复发)。
Co-Authored-By: Claude Opus 5 (1M context) noreply@anthropic.com
d2be33f