2026.8.7.1 发布后按 #363 的纪律对当时的真实索引重扫,发现三个包的唯一发布键是预发布形状:
| 包 |
键 |
compat.glad |
0.0.0-651a425 |
compat.tray |
0.0.0-8dd1358 |
compat.re2 |
2022-04-01(数值核 2022 + 预发布标识 04.01) |
对这类包写范围约束,2026.8.7.1 报:
error: dependency 'compat.glad': constraint '*' matches none of: [0.0.0-651a425]
行为是对的(npm/Cargo 规则下范围本来就看不见预发布),不是回归——改之前 * 会把 0.0.0-651a425 截断成 0.0.0 然后返回这个索引里不存在的地址,失败得更晚更难归因。而最常见的入口 mcpp add 只支持精确版本(M2),写进 manifest 的就是字面键,构建正常:
Compiling compat.glad v0.0.0-651a425
缺的是那一行修法提示。 resolve_semver 里的 pin_hint(「These keys are not ordered versions … pin one exactly」)只在 unorderable 键上触发;而 0.0.0-651a425 是可排序的预发布,落进 literals 这一支,于是走的是不带提示的 matches none of 分支。对「候选全是预发布」的包,范围永远不可能匹配,用户需要被直接告诉写什么。
建议
best.empty() 分支里,如果 literals 里所有候选都是预发布,就把 pin_hint 一起给出去,并说明原因(范围按 SemVer 看不见预发布)。判据与 unorderable 那条一样:「范围永远够不着」的情况,错误信息要给出能粘贴的那一行。
复现
[dependencies]
"compat.glad" = "*" # 或 "^0.0"
发现方式:发布后用 2026.8.7.1 扫 mcpp-index + xim-pkgindex 的全部版本键,再逐个用真二进制核实(github-gh 的「平局」是假阳性——第二处 ["2.86.0"] 在注释里,mcpp 会剥注释)。
2026.8.7.1 发布后按 #363 的纪律对当时的真实索引重扫,发现三个包的唯一发布键是预发布形状:
compat.glad0.0.0-651a425compat.tray0.0.0-8dd1358compat.re22022-04-01(数值核2022+ 预发布标识04.01)对这类包写范围约束,2026.8.7.1 报:
行为是对的(npm/Cargo 规则下范围本来就看不见预发布),不是回归——改之前
*会把0.0.0-651a425截断成0.0.0然后返回这个索引里不存在的地址,失败得更晚更难归因。而最常见的入口mcpp add只支持精确版本(M2),写进 manifest 的就是字面键,构建正常:缺的是那一行修法提示。
resolve_semver里的pin_hint(「These keys are not ordered versions … pin one exactly」)只在 unorderable 键上触发;而0.0.0-651a425是可排序的预发布,落进literals这一支,于是走的是不带提示的matches none of分支。对「候选全是预发布」的包,范围永远不可能匹配,用户需要被直接告诉写什么。建议
best.empty()分支里,如果literals里所有候选都是预发布,就把pin_hint一起给出去,并说明原因(范围按 SemVer 看不见预发布)。判据与 unorderable 那条一样:「范围永远够不着」的情况,错误信息要给出能粘贴的那一行。复现
发现方式:发布后用 2026.8.7.1 扫
mcpp-index+xim-pkgindex的全部版本键,再逐个用真二进制核实(github-gh的「平局」是假阳性——第二处["2.86.0"]在注释里,mcpp 会剥注释)。