问题
[dependencies] ccc = { git = "https://github.com/ZheFeng7110/ccc", branch = "develop" } 这种 branch 引用的 git 依赖,每次 mcpp build 都会执行 git ls-remote,即使 mcpp.lock 已经锁定了具体 commit。
当前 src/build/prepare.cppm 对 branch 依赖的处理是:每次 build 都 ls-remote 分支 HEAD,然后解析为 commit 再作为缓存 key。这导致:
- 慢网络下频繁等待
- 离线/无网环境下构建失败
- 与
mcpp.lock 的“锁定语义”不一致
期望行为
把 mcpp.lock 作为 git 依赖的离线锚点:
- 若 lock 已记录该 git 依赖的 commit,且本地
~/.mcpp/git/<hash> 缓存的 HEAD 与 lock commit 一致,则直接复用缓存,不再 ls-remote。
- 仅当 lock 不存在/无该包/无 commit/缓存 commit 不匹配时,才执行网络请求。
mcpp update 清除 lock 条目后,下次 build 重新 ls-remote 并写入新 commit。
- 对
rev 和 tag 也纳入 lock 决策,保持统一语义。
离线模式
--offline 下,若 lock 有 commit 且缓存命中,应允许构建。
- 若 lock 有 commit 但缓存缺失,离线模式应失败(无法 clone)。
- 若 lock 无 commit,离线模式应失败,提示需要先用非离线模式或
mcpp update。
涉及模块
src/pm/lock_io.cppm:新增 lock 中 git source 的解析工具
src/build/prepare.cppm:读取 lock、命中 branch 缓存、离线模式
tests/e2e/24_git_dependency.sh:增加 branch 锁定/不重新 ls-remote 的用例
问题
[dependencies] ccc = { git = "https://github.com/ZheFeng7110/ccc", branch = "develop" }这种 branch 引用的 git 依赖,每次mcpp build都会执行git ls-remote,即使mcpp.lock已经锁定了具体 commit。当前
src/build/prepare.cppm对 branch 依赖的处理是:每次 build 都ls-remote分支 HEAD,然后解析为 commit 再作为缓存 key。这导致:mcpp.lock的“锁定语义”不一致期望行为
把
mcpp.lock作为 git 依赖的离线锚点:~/.mcpp/git/<hash>缓存的 HEAD 与 lock commit 一致,则直接复用缓存,不再ls-remote。mcpp update清除 lock 条目后,下次 build 重新ls-remote并写入新 commit。rev和tag也纳入 lock 决策,保持统一语义。离线模式
--offline下,若 lock 有 commit 且缓存命中,应允许构建。mcpp update。涉及模块
src/pm/lock_io.cppm:新增 lock 中 git source 的解析工具src/build/prepare.cppm:读取 lock、命中 branch 缓存、离线模式tests/e2e/24_git_dependency.sh:增加 branch 锁定/不重新 ls-remote 的用例