Skip to content

fix(pkgs): chriskohlhoff.asio name 回归 FQN 形式 + lint 守卫 (mcpp#278)#116

Merged
Sunrisepeak merged 1 commit into
mainfrom
fix/chriskohlhoff-asio-fqn-name
Jul 25, 2026
Merged

fix(pkgs): chriskohlhoff.asio name 回归 FQN 形式 + lint 守卫 (mcpp#278)#116
Sunrisepeak merged 1 commit into
mainfrom
fix/chriskohlhoff-asio-fqn-name

Conversation

@Sunrisepeak

Copy link
Copy Markdown
Member

修复 main 上 run 30121144277 的三平台失败(linux / macos / windows 同一处:tests/examples/asio-module,1/22 member(s) failed)。

error: xlings install_packages failed (exit 1) for 'chriskohlhoff.asio@1.38.1'
  xlings reported: E_NOT_FOUND: package 'chriskohlhoff:chriskohlhoff.asio@1.38.1' not found

根因

#109pkgs/c/chriskohlhoff.asio.luaname"chriskohlhoff.asio" 改成 "asio"(namespace 不变)。这是该 commit 对描述符的唯一功能性改动 —— 其余全是注释重写。

坏在 mcpp 内部两条规则对同一份描述符的口径不一致:

规则 ns="chriskohlhoff", name="asio"
身份归一化 canonical_xpkg_identity(mcpp manifest/xpkg.cppm) name 未带 namespace 前缀就补上 接受,归一化成 chriskohlhoff.asio
安装目标构造(mcpp build/prepare.cppm) ns + "." + shortName,并假设它 == name 字面值 发出 chriskohlhoff:chriskohlhoff.asio@1.38.1
索引 key(xlings/libxpkg build_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 原样):

消费端写法 发给 xlings 的 target 结果
[dependencies.chriskohlhoff] + asio chriskohlhoff:chriskohlhoff.asio@1.38.1 ✗ E_NOT_FOUND(CI 现场)
[dependencies.chriskohlhoff] + "chriskohlhoff.asio" ✗ ns 拼两遍 → chriskohlhoff.chriskohlhoff.asio
[dependencies] + "chriskohlhoff.asio"(点式) chriskohlhoff:chriskohlhoff.asio@1.38.1 ✗ 归一化回 ns/short,同第一行
[indices] default + 裸 asio ✗ 身份闸门失败(描述符 ns ≠ 默认 ns)

ns 被身份闸门钉死、短名被 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.luaname 写回 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.yml rule 5namespace 非空时强制 name"<namespace>." 开头,秒级拦下这类错误。

验证

CI 钉住的 mcpp 0.0.102 + vendored xlings 0.4.67,冷 store、冷 index cache:

$ cd tests/examples/asio-module && mcpp test
 Downloading chriskohlhoff.asio v1.38.1
 Downloading chriskohlhoff:chriskohlhoff.asio@1.38.1
   Compiling asio-module-tests v0.1.0 (.)
     Running bin/core / coroutine / experimental / network / surface
 test result ok. 5 passed; 0 failed
  • lint 全量重放(4 条既有规则 + 新规则,49 个描述符):exit 0
  • 负向测试:把 name 改回 "asio" → 新 lint 如期报错并给出可直接照抄的修正值
  • mcpp xpkg parse(0.0.102)对两个改动文件均 parse OK

上游

已提 mcpp-community/mcpp#278 —— mcpp 要么构造 target 时改用描述符声明的 name(loadVersionDepluaContent 已在作用域内),要么收紧规范让 mcpp xpkg parse 直接拒绝 split 形式(倾向后者)。本 PR 的 lint 是上游对齐之前索引侧的守卫。

#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 是上游对齐前索引侧的守卫。
@Sunrisepeak
Sunrisepeak merged commit 6d1f681 into main Jul 25, 2026
5 checks passed
@Sunrisepeak
Sunrisepeak deleted the fix/chriskohlhoff-asio-fqn-name branch July 25, 2026 00:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant