pip download --no-deps somepkg==2.3.1 -d ./vendor
pip install --no-index --find-links=./vendor somepkg==2.3.1

半年前能构建的镜像今天重建失败,报 ERROR: Could not find a version that satisfies the requirement somepkg==2.3.1。pypi 页面上这个版本还在,只是标了 yanked。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,作者撤回版本后,pip 解析时会跳过 yanked 的版本,除非约束精确到 == 且没有别的候选。CI 每次都重新解析,依赖的是索引当前状态而不是上次构建的结果。

「版本被 yank」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。

验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。

处理上按这个顺序:把构建用到的 wheel 全部下载到内网制品库 不再依赖公网索引;约束文件里写死 == 并对已下载的包做 hash 校验;确需继续用 yanked 版本时精确匹配是允许的 但要自己承担风险;把制品库地址写进 pip.conf 让所有构建走同一份快照。

改完只确认一件事:断网状态下构建仍能装上 2.3.1 日志里不再出现 yanked 相关提示。

作者 9823189