Skip to content

[resolver] 只有预发布键的包:范围约束的错误信息缺少「精确 pin」那一行(#363 发布后生态扫描发现) #370

Description

@Sunrisepeak

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 会剥注释)。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions