# 21 — 资源布局迁移(ADR 0008)的漏网之鱼 Status: resolved Type: bug ## 现象 ADR 0008 把 `wallpapers/` 的资源从**按类型分**(`effects/` + `images/`)改成**按骨架分** (`spines/<骨架名>/` + `scene/`)。迁移完成后,四处没跟上: - `wallpapers/hsr/kv37/spines/kv37/kv37.json` 与 `wallpapers/hsr/xilian/spines/xilian/xilian.json` 里作者的目录字段还指着旧布局: `"images": "../images/"`(kv37 另有一处 `"audio": "../audios"`)。 ys 的 16 具骨架(下载器 `promote.py` 产出)已经是空串 / 没有该键——**只有 hsr 这两具手改过的存量**。 - `wallpapers/README.md` 的目录树(第 17-34 行)与第六节是新布局,但**第五节的 preset 示例** (单骨架与场景各一处)和**第七节「加一档新壁纸」第 4 步**还写着 `./images/`、`./effects/`。 另外「加一个新游戏」还漏了上一轮才变成必填的 `title`。 - 代码注释里的旧目录举例:`tools/lib/bundle.ts`(4 处)、`tools/lib/generate.ts` 的 `assetRelIn` 注释、`src/runtime/index.ts` 的基准说明。 - ADR 0001 第 7 行与 ADR 0005 第 43 行仍断言"三层同名目录**不变**"——被 ADR 0008 取代后, 没有任何地方声明这次取代。 ## 影响 `images` / `audio` 这两个字段**今天的运行时并不读**:播放器调的是 `loadTextureAtlas(config.atlasUrl)`, **单参** ⇒ `pathPrefix` 为空,贴图页按 atlas 所在目录解析;`skeleton.images` 只进 `skeletonData.imagesPath`。 所以这不是渲染故障,而是**数据与规范不一致**;真正的危险是以后有人用上共享贴图或事件音, 它会静默指向一个不存在的路径。文档与注释那两半则是纯粹的误导。 ## 改动 | 文件 | 改动 | | --- | --- | | `wallpapers/hsr/{kv37,xilian}/spines/*/*.json` | `images` / `audio` 归一化成空串 | | `wallpapers/README.md` | 第五、七节示例改新布局;第六节补"骨架 json 作者目录字段留空串"规则;「加新游戏」补 `title` | | `tools/lib/bundle.ts`、`tools/lib/generate.ts`、`src/runtime/index.ts` | 注释里的旧目录举例更新 | | `docs/adr/0001`、`docs/adr/0005` | 就地标注"已被 ADR 0008 取代"(沿用 ADR 0002 的删除线惯例) | | `docs/adr/0008` | 顶部补"取代 ADR 0001 第 7 行 / ADR 0005 第 43 行" | ## 验证 `pnpm build` 六个分发全过;`pnpm check` 全绿(含 `check-collection-copy`); `dist/releases` 里 `../images/` **零命中**——旧前缀没有跟着产物上传 (`../audios/`、`../../audios/` 在合集里命中是**设计如此**:合集 preset.js 在下一层,音频在分发根,见 ADR 0005)。 ## 顺带发现(本次没动) `wallpapers/ys/nico-tea/spines/<骨架名>/meta.json` 是下载器写的**逐骨架来源记录** (spine 版本 / 动画 / 皮肤 / 贴图页 / 来源 URL,见 `tools/downloader/README.md`)。 `copyWallpaperAssets` 按目录整体搬 `spines/`,所以这些记录会**跟着分发一起上传**(hsr 的骨架没有)。 来源 URL 留在发布物里是否合适,是产品决定;要清掉就得让搬移跳过 `spines/**/meta.json`。