把项目从「手写 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 处引用自包含。
1.7 KiB
1.7 KiB
02 — 两个根:页面根与模块根必须分开算
Status: resolved Type: task
问题
合集分发的自包含页音频报 ERR_FILE_NOT_FOUND,spine 骨架报 rawDataURIs 缺键。单档分发全绿。
诊断
自包含页在 <分发根>/sim/index.html,preset.js 在 <分发根>/<壁纸id>/preset.js。两个位置对应两个不同的相对基准:
- 页面根:资源相对分发根寻址,相对页面恒为
"../",与合集深度无关。 - 模块根:
preset.js的import.meta.url是它自己所在目录,相对页面是"../<壁纸id>/"。
曾经两者都写成 "../".repeat(depth):collection-all(深度 2)资源根变 "../../"(跑到 dist/releases/),合集 preset.js 把 ./audios/… 少解析一层。
同时资源表的建键基准也错了:用 assetUrlIn(相对 preset.js)建键会丢掉合集里的 <壁纸id>/ 这一段,运行时按分发根相对路径查不中。
答案
assetRoot固定为"../",不再乘深度。transformModule按moduleDir把new URL("./", __importMetaUrl)改写成new URL("../<moduleDir>/", document.baseURI)。- 新增
generate.ts的assetRelIn(release, wallpaper, rel)(分发根相对),资源表改用它;assetUrlIn保留给发布产物。 - 音频键用
urlKey剥掉../前缀即可(audioPathIn已经是分发根相对形式),不再拼<壁纸id>/——两个基准不同,别合并。
教训
这两个错误都长成"表和模块看起来都对,只有某个资源不对",极易误判成那个资源自己的内联逻辑。单档分发两种错误都不出现,只测单档会一路绿灯——所以验收必须覆盖四档。