fix(pkgs): chriskohlhoff.asio name 回归 FQN 形式 + lint 守卫 (mcpp#278)#116
Merged
Conversation
#109 把 pkgs/c/chriskohlhoff.asio.lua 的 name 从 "chriskohlhoff.asio" 改成 "asio"(namespace 不变),这是该 commit 对描述符的唯一功能性改动, 其余全是注释重写。结果三平台 workspace job 全部在 tests/examples/asio-module 上失败: E_NOT_FOUND: package 'chriskohlhoff:chriskohlhoff.asio@1.38.1' not found 原因是 mcpp 内部两条规则对同一份描述符的口径不一致:身份归一化层 (manifest/xpkg.cppm canonical_xpkg_identity)认为 split 形式 (namespace="chriskohlhoff" + name="asio")与 FQN 形式等价、都合法, 而安装目标构造层(build/prepare.cppm)硬假设 name 字面值就等于 ns + "." + shortName。xlings/libxpkg 按前者的 name 字面值建索引 key (entries[package.name] = "asio"),mcpp 却拿 "chriskohlhoff.asio" 去点名, 两者永远不相交。 实测四种消费端写法(点式选择器、ns 表内点式、default 索引裸名、别名索引 裸名)全部无解 —— ns 被身份闸门钉死、短名被 xpm 版本表钉死,fqname 恒为 chriskohlhoff.asio 而 key 恒为 asio。等价约束是 name 必须 == namespace + "." + <短名>,只能在描述符里修。 改动: * pkgs/c/chriskohlhoff.asio.lua — name 写回 FQN 形式(与索引内其余 47 个 namespaced 包一致)。文件路径、namespace、消费端 mcpp.toml 均不动。 * pkgs/t/tensorvia-cpu.lua — 同类隐患(ns="aimol" + name="tensorvia-cpu"), 今天没被任何 workspace member 消费所以没暴露,但同样装不上;一并修正。 该文件是 `mcpp emit xpkg` 生成后手工补了 namespace 才落入 split 形式。 * tests/check_package_name.lua + validate.yml rule 5 — namespace 非空时 强制 name 以 "<namespace>." 开头。lint 秒级拦下,不再让这类错误跑满 三平台一小时后才炸。 验证(CI 钉住的 mcpp 0.0.102 + vendored xlings 0.4.67,冷 store 冷索引缓存): tests/examples/asio-module → 5 passed; 0 failed。lint 全量重放 exit 0, 负向测试(把 name 改回 split 形式)如期报错。 上游已提 mcpp-community/mcpp#278:mcpp 要么构造 target 时用描述符声明的 name(loadVersionDep 里 luaContent 已在作用域内),要么收紧规范让 `mcpp xpkg parse` 直接拒绝 split 形式。本 lint 是上游对齐前索引侧的守卫。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
修复 main 上 run 30121144277 的三平台失败(linux / macos / windows 同一处:
tests/examples/asio-module,1/22 member(s) failed)。根因
#109 把
pkgs/c/chriskohlhoff.asio.lua的name从"chriskohlhoff.asio"改成"asio"(namespace不变)。这是该 commit 对描述符的唯一功能性改动 —— 其余全是注释重写。坏在 mcpp 内部两条规则对同一份描述符的口径不一致:
ns="chriskohlhoff", name="asio"canonical_xpkg_identity(mcppmanifest/xpkg.cppm)name未带 namespace 前缀就补上chriskohlhoff.asiobuild/prepare.cppm)ns + "." + shortName,并假设它 ==name字面值chriskohlhoff:chriskohlhoff.asio@1.38.1build_index)entries[package.name]字面值asio两者永不相交 →
E_NOT_FOUND。而 lint 只检查name =字段存在,mcpp xpkg parse因为走的是归一化路径也照样打印package chriskohlhoff.asio (namespace 'chriskohlhoff'),所以 lint job 全绿,错误一路漏到三平台跑满 20~58 分钟才炸。消费端无解。 实测四种写法(CI 钉住的 mcpp 0.0.102,索引为
origin/main原样):[dependencies.chriskohlhoff]+asiochriskohlhoff:chriskohlhoff.asio@1.38.1[dependencies.chriskohlhoff]+"chriskohlhoff.asio"chriskohlhoff.chriskohlhoff.asio[dependencies]+"chriskohlhoff.asio"(点式)chriskohlhoff:chriskohlhoff.asio@1.38.1[indices] default+ 裸asions 被身份闸门钉死、短名被 xpm 版本表钉死,fqname 恒为
chriskohlhoff.asio而 key 恒为asio。等价约束是name必须 ==namespace + "." + <短名>,只能在描述符里修。也顺带排除了"升客户端版本能绕过"的可能:
git diff v0.0.102..v0.0.103 -- src/pm src/build/prepare.cppm src/manifest/xpkg.cppm只动了index_spec.cppm的 artifact/source 字段,解析路径一行没变;用一个只存在于 path index 的版本号做探针,0.0.103 同样E_NOT_FOUND。(排查时要小心一个陷阱:本机全局~/.mcpp/registry/data/mcpplibs若还停在改动之前的快照,本地mcpp build会从那份旧索引满足请求而显得正常。)改动
pkgs/c/chriskohlhoff.asio.lua—name写回 FQN 形式。文件路径、namespace、消费端mcpp.toml全不动;与索引内其余 47 个 namespaced 包写法一致。pkgs/t/tensorvia-cpu.lua— 同类隐患(ns="aimol"+name="tensorvia-cpu"),今天没被任何 workspace member 消费所以没暴露,但同样装不上。该文件是mcpp emit xpkg生成后手工补了namespace才落入 split 形式 —— 一并修正为aimol.tensorvia-cpu。tests/check_package_name.lua+validate.ymlrule 5 —namespace非空时强制name以"<namespace>."开头,秒级拦下这类错误。验证
CI 钉住的 mcpp 0.0.102 + vendored xlings 0.4.67,冷 store、冷 index cache:
name改回"asio"→ 新 lint 如期报错并给出可直接照抄的修正值mcpp xpkg parse(0.0.102)对两个改动文件均parse OK上游
已提 mcpp-community/mcpp#278 —— mcpp 要么构造 target 时改用描述符声明的
name(loadVersionDep里luaContent已在作用域内),要么收紧规范让mcpp xpkg parse直接拒绝 split 形式(倾向后者)。本 PR 的 lint 是上游对齐之前索引侧的守卫。