把项目从「手写 dist/」改成「wallpapers/ 是唯一真相来源,dist/ 由 pnpm build 生成」,
并补上配套的类型、门禁与抓取器。一次提交落地整条管线,因为拆开会留下不能构建的中间态。
- src/:运行时与模拟器源码(TS,strict),编译到 build/ 再拷进各分发
- tools/:build / dev / check-{syntax,paths,dist},以及抓取器与回归门禁 tools/checks/
(.scratch/ 下那批一次性脚本移入 tools/checks/ 并入库为长期门禁)
- wallpapers/:七档壁纸的源数据 + README.md(id/音频/预设的完整规范)
- docs/adr/0005-0008:构建管线与分发拓扑、模拟器契约、自包含 sim、每骨架资源布局
- .gitignore:排除 .scratch/ 的参考资料副本(上游 spine 整仓克隆 ~1.2 GB、
抓取侦查数据 ~680 MB)与调试转储;这些是本地调查材料,补偿会让仓库无法克隆
- 归一化 .gitignore/CONTEXT.md 行尾(工作区 CRLF、索引 LF 造成的整文件假 diff)
同时修掉三档卡住构建的未完工壁纸:
- kv45 的 meta.json 里 id 还是抓取期场景名 scene_main,经 downloader promote 正名为 kv45
- shajin / zhigengniao_juheye 的 meta.json 误用了骨架描述文件(name/spine/animations/pages)、
且都缺 preset.template.json;现按规范重建:骨架沉到 spines/<名>/(spine-ts 按 atlas 所在
目录解析贴图页)、补上元数据与单骨架预设,并清掉 zhigengniao 骨架里指向作者机的绝对路径
- 顺带 promote 已在 sources.yml 里的 kv46(月升之前,与兽共舞)
pnpm check 五道门全绿:10 个分发 / 7 档壁纸 / 141 处引用自包含。
52 lines
3.1 KiB
Markdown
52 lines
3.1 KiB
Markdown
# 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`。
|