pip install --dry-run --report report.json -r requirements.in pip-compile --resolver=backtracking requirements.in
pip install -r requirements.txt 卡在 Collecting 之后十分钟,日志反复打印 Looking in indexes 和一串候选版本。最后报 ResolutionTooDeep: 2000000。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。
追下去是这么回事:依赖之间有交叉约束,新解析器会尝试多种组合回溯,每换一次候选就重新算一遍。约束写得越松,搜索空间越大,耗时越长。
「pip 依赖回溯」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。同一份配置存在多处的,先确认改的是被加载的那一份。
新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。
处理上按这个顺序:先给顶层依赖加明确的上下界 缩小候选范围;requirements 拆成直接依赖和锁文件两层 用 pip-compile 离线解析一次;解析时加 --no-cache-dir 排除缓存造成的假象 再观察耗时;确实无解就单独装可疑的那个包 用 --dry-run 看它的约束。
确认没问题再收工,解析在 30 秒内结束 report.json 里每个包只有一个确定版本。
