Repository navigation
✨ feat(metadata): 统一源树与发布物读取入口 - #65
mrbbbaixue wants to merge 1 commit into
Conversation
🚀 Deploying Preview to Cloudflare 🚀Preview Deployments by commit
|
|
第二步:Desktop仓库接入,并且实现Metadata缓存功能 |
审查结论能简化,但建议先修正确性问题,再合并。审查提交: 需要修复1. [P1] HTTP 文件去重不应忽略路径大小写位置:MetadataFlattener.cs:445–446
已复现:入口分别 Include 建议:文件身份比较由源实现决定,不能在展平器里统一忽略大小写。 2. [P1] 60 秒超时没有覆盖正文读取
已启动实际 HTTP 服务验证:立即返回响应头,64 秒后发送 建议:请求与正文读取共用明确的超时预算,而不是只设置 3. [P2] 入口越界检查发生在读取之后
已复现:指定允许根为 建议:路径规范化、确定源根和入口边界检查,都放在首次读取之前。 4. [P2] HTTP 入口仍然请求两次只有 已复现: 建议:复用首次读取的入口文档;若保留正文缓存,让两个入口一致使用它。 最值得做的简化
次要缺口:新校验器漏查 另有网络层契约冲突:新 验证
|
25f42b9 to
dc94f47
Compare
|
审查后修复已推送 000d880:删除LocalId手写百分号格式拒绝,完整键scope:icon%raw与scope/icon%raw可原样匹配;删除OfflineSource无效disk参数及不可达远程raw-cache分支,保留本地Source安全边界。完整Metadata测试428/428通过;实际production根/引用与22/22独立清单、本地RisingStorm完整清单、无磁盘缓存Include组合读取和原仓库CLI Build全部通过。没有修改原始数据/XSD。 |
584c730 to
ab6928e
Compare
b175dc1 to
a237549
Compare
- 源树与展平发布物共用 MetadataReader / MetadataClient:指定入口 metadata.xml 即可读取,Include 递归展开、菱形去重、路径限制在源根 - SchemaVersion 改由作者写在源根 metadata.xml,构建不再注入版本,读入口缺失直接失败 - 删除构建期修订标记 ContentRevision:构建参数、CLI、发布 XSD 与 CI 传递一并移除 - 修复叶子存根 Source 被当成待内联正文导致的无限请求链(Linux CI 卡死) - 保持按完整注册键精确匹配,旧资源地址与本地组合缓存兼容;移除冒号与百分号限制 - 删除兼容模式,统一语义与测试结构 - 文档补充单入口读取说明与可视化预览,新增三篇决策笔记,重生成路径清单与笔记索引
a237549 to
54cff02
Compare
这个 PR 在解决什么
同一份元数据原来有四处各自解析:源树读取(
LoadSource)、构建展平(MetadataFlattener)、发布导出(MetadataSourceExporter)、运行时缓存(MetadataClient)。Include 展开、继承、短 ID 补全、Source 归一化各写一遍,行为靠人肉对齐。这个 PR 收成一条路:MetadataReader读并合成,产出规范化模型和捕获的原始文档 / Include 边;MetadataExporter只决定输出怎么组织(Flat / Tree / Mixed);MetadataBuilder变成「校验 + 调 Export + 变量替换 + WebP + 发布 XSD 校验」;MetadataClient只负责取数,落一份规范化完整快照。读取(
Ra3.BattleNet.Metadata/Reading/)MetadataReader.Read(pathOrUrl, options).Root是唯一入口,本地源树和已发布展平物走同一条路:Include递归展开、菱形去重、循环报错,所有路径锁在SourceRoot内。scope/local;已有含/、:的完整键原样保留并精确匹配,短 ID 只在唯一命中时补全,多义直接失败。Source相对定义它的文档解释,输出成入口目录相对路径;SourceRoot只做包含校验,不当地址回退;Image@Url优先于Source;HTTP 文档不能引用本地文件。MetadataParser退回纯 XML 到模型的投影。导出(
Exporting/)MetadataExporter.Export用一套布局算法产出 Flat / Tree / Mixed;Mixed 用--inline=挑哪些边留在外部;--inline-manifests、--resolve-variables是显式开关。Output/再抛。MetadataSourceExporter保留发布物反向导出作者源的能力,仍按短 ID 写。构建(
Building/)Build现在就是 Reader + Exporter + 原有的 XSD、域模型、变量残留、WebP、发布 XSD 校验;MetadataFlattener和独立的展平复制管线删除。MetadataBuilder.Load、LoadSource、Open。契约变化
SchemaVersion改由作者写在源根metadata.xml的根节点,缺失时构建直接失败;构建不再注入版本。ContentRevision:构建参数、CLI、发布 XSD 必填项、build.sh、deploy.yml传参一起移除。--schema-version=、--id-format,新增export --layout=flat|tree|mixed、--inline=、--inline-manifests、--resolve-variables。SchemaVersion属性改成Tags/Commit是否已被替换成时间戳。缓存(
Cache/)GetLeafAsync/RefreshLeafAsync/GetCachedLeafAsync换成按PackageEntry的GetPackageAsync/GetCachedPackageAsync/RefreshPackageAsync。顺带修的 bug
叶子清单 stub 的
Source被当成「待内联正文」继续追踪,HTTP 文档会不断拼出新 URL;Linux CI 上表现为单测 13 分钟没有任何进展被取消,Windows 本地因路径长度限制先炸,掩盖了它。结构与测试
Reading/、Exporting/、Building/、Cache/分层,测试目录同构;只覆盖旧入口的IncludeTests并入新用例,StageATests更名BuildTests;新增 Reader、Export、PathSecurity、CompositionCache 等用例。README.md、ARCHITECTURE.md、library-api.md、data-authoring.md、build-and-release.md;新增 3 篇决策笔记和作者向预览页.agents/docs/visuals/metadata-authoring.html。破坏性变更与下游
--schema-version/--content-revision均不兼容。a237549,需要更新到本 PR 的新提交后,再跑默认引用构建与服务冒烟。验证
verify.yml:文档校验、dotnet test、源数据构建全部通过;Workers 预览构建通过。dotnet test Metadata.sln:430 通过、0 失败。node scripts/verify-docs.mjs:23 篇笔记、2 份生成物、41 份文档通过。main最新ac26057,分支保持单个提交。