Files
BakNRet/docs/adr/0004-slot-layout-and-staging.md
Shuery 3a3a57a6a1 docs: 决策记录 8 条、变更日志、README 的验收与口令两节
0007 与 0008 是本次改造新产生的决策(原计划 6 条)。它们同样满足「后人会问为什么」:把运行锁改成互斥体、或给库里 27 个函数补上 SupportsShouldProcess,都是看起来更规范的错法。

CHANGELOG.md:把 README 里那 33 行「相对旧版修了什么」整节搬过去,并补上本次改造的记录(11 条修复 + 6 条结构与规范,每条修复都写明现象与现状)。README 那一节换成指针。

README 新增两节:「验收与静态分析」(六个层次、Run-RealSmoke 为什么独立存在、以及那 6 条格式规则默认 Disabled 这个容易漏掉的事实);「口令放在哪里」(默认留空不是遗漏,附迁移与验证命令)。

.markdownlint.json 照 PowerShell 主仓库的实践(default true、行长 240),只把 MD024 从关闭改成「仅同级不重复」,因为变更日志需要重复标题。顺带按 .editorconfig 把 .md 的 BOM 去掉。
2026-09-27 10:01:54 +08:00

1.0 KiB

Slot 决定归档内的顶层目录名,靠暂存目录 + junction 实现

7z 没有"入库时改名"的能力:加进归档的名字就是文件系统上的名字。而一个软件可以有多块内容 (Scoop 既有自己的配置又有各应用的 persist),两块都可能叫 persist 之类的同名目录 —— 直接打包会在归档里撞在一起。

所以名录里给每块内容起一个 Slot 名,打包前用暂存目录把每个 Slot 以正确的名字挂进去 (目录项用 junction、文件项优先硬链接),打包后立刻拆掉。归档内因此永远是 <Slot>\<内容> 这一层结构,恢复端可以按 Slot 逐棵子树解出来(零拷贝时也靠 junction)。

代价:备份过程多一个暂存目录,而暂存目录必须保证被拆掉 —— 里面的 junction 指向真实数据, 残留它等于在 %TEMP% 里留下一堆指回真实目录的连接点。所以 New-BakNRetArchiveStaging 自己带 try/catch 自清理,而不依赖调用方(调用方在函数抛错时拿不到返回值)。