复现步骤
- 工程声明一个本地索引和一个走 SemVer 约束的依赖:
[indices]
acme = { path = "local-index" }
[dependencies.acme]
util = "^2.0"
local-index/pkgs/a/acme.util.lua 里正常声明 namespace = "acme", name = "util",xpm 表里有 2.0.0。
mcpp build
期望行为
^2.0 解析为 2.0.0,与写死 util = "2.0.0" 时的行为一致 —— 后者能正常解析安装。
实际行为
dependency acme.util has SemVer constraint ^2.0 but the index entry
isn't cloned locally yet — run `mcpp index update` first
mcpp index update 对本地 path 索引毫无作用,用户没有任何出路。
根因
mcpp::pm::resolve_semver / try_merge_semver 拿 mcpp::pm::Fetcher&,内部直接 fetcher.read_xpkg_lua(ns, shortName) —— 只读全局 registry(<XLINGS_HOME>/data)。而依赖解析本身走的是 mcpp.pm.index_route 的三路分发(本地 path 索引 / 项目 clone / 全局 registry)。
即:候选选择阶段能通过项目索引找到这个包,版本解析阶段却看不见它。同一族缺陷在 #305/#307 里已经修过 mcpp add 那一侧,resolve_semver 是当时明确记为后续的最后一处。
涉及模块
src/pm/resolver.cppm
src/build/prepare.cppm(两个调用点:依赖 SemVer 解析、约束合并)
src/scaffold/create.cppm(mcpp new --template 的 "*" 解析,无工程上下文)
复现步骤
local-index/pkgs/a/acme.util.lua里正常声明namespace = "acme", name = "util",xpm表里有2.0.0。mcpp build期望行为
^2.0解析为2.0.0,与写死util = "2.0.0"时的行为一致 —— 后者能正常解析安装。实际行为
mcpp index update对本地 path 索引毫无作用,用户没有任何出路。根因
mcpp::pm::resolve_semver/try_merge_semver拿mcpp::pm::Fetcher&,内部直接fetcher.read_xpkg_lua(ns, shortName)—— 只读全局 registry(<XLINGS_HOME>/data)。而依赖解析本身走的是mcpp.pm.index_route的三路分发(本地 path 索引 / 项目 clone / 全局 registry)。即:候选选择阶段能通过项目索引找到这个包,版本解析阶段却看不见它。同一族缺陷在 #305/#307 里已经修过
mcpp add那一侧,resolve_semver是当时明确记为后续的最后一处。涉及模块
src/pm/resolver.cppmsrc/build/prepare.cppm(两个调用点:依赖 SemVer 解析、约束合并)src/scaffold/create.cppm(mcpp new --template的"*"解析,无工程上下文)