Poetry 镜像文件哈希没变却安装失败,检查混合摘要算法
Poetry 2.5.1 读取 JSON 镜像与混合 SHA-256/SHA-512 锁定记录时,可能跳过有匹配摘要的 wheel。逐文件核对算法,再审查锁定和镜像策略。
Poetry 从私有镜像安装已锁定的包,版本没变,却报 Downloaded distributions ... did not match any known checksums in your lock file;调试日志里跳过了适合当前平台的 wheel,选用的摘要前缀是 sha512:,锁文件对该文件保存的却是 sha256:。先比较同一文件的摘要算法与锁定记录,不能只凭“哈希不匹配”就认定文件被改了。
Poetry 2.5.1 配合提供 JSON Simple API 的惰性缓存镜像,有明确触发。镜像未缓存文件时只转发 SHA-256,缓存后又公布 SHA-256、SHA-512 等多种摘要;同一个包的锁定条目因此可能混用算法。
选择了更强算法,也可能选错比较对象
2.5.1 会取整个包锁定记录中出现的算法,与当前文件公布的算法求交集,再选择优先级高的一种来比较。只要包的某个文件锁定过 SHA-512,另一个文件也公布 SHA-512,即使它已有匹配的 SHA-256,仍可能被选中的 SHA-512 排除。
摘要字符串只有在算法相同、文件字节相同的前提下才能直接比较。不能把一个文件的 SHA-256 与它的 SHA-512 当作应当相等的值,也不能拿同版本下另一个平台 wheel 的摘要作对照。
日志里大量“不支持 ABI”的 wheel 可以是正常筛选结果。重点查适合当前 Python、架构和平台的那一个文件,为何随后被 checksum 分支跳过。若 sdist 恰好仍可用,安装还可能退回源码构建,表现为突然需要编译器,而没有立刻报 checksum 错误。
先核对文件,再调整锁定或镜像策略
保留原锁文件、工具版本、脱敏后的镜像元数据和失败日志。针对确切文件名,从可信的发行记录核对文件与摘要,确认不是下载损坏、同名文件替换或镜像返回错误内容。没有完成这一步,不能把所有校验错误都归到算法选择。
已确认属于混合算法选择时,可以在独立变更中重新生成相应锁定记录,再检查差异。Poetry 2.5.1 的普通 poetry lock 默认保留已有锁定版本,但仍应审查包版本、文件名、来源与摘要;不要直接套用 --regenerate,让全部包重新求解后失去原故障对照。
重新锁定可能只是让当前缓存状态下的算法一致。镜像随后缓存更多文件,问题还可能再次出现。因此还应评估由镜像对同类文件稳定公布受支持摘要的策略,或等待包含相同场景修复的正式工具版本。策略调整需要保留可核验的强摘要,不是移除哈希保护。
截至 2026 年 10 月 26 日,正式 Poetry 2.5.1 的上述选择路径仍在。不要删除 lock 中所有 hashes、关闭校验或强装下载文件;这样只会取消完整性边界。
验收在镜像已有缓存和新缓存文件两种状态下检查,确认选择了预期 wheel,而非意外回退 sdist,并核对锁定版本和运行结果。恢复旧锁文件时,也要恢复对应环境;仅改回文本不会撤销已经安装的依赖。


