poetry 不自动响应 pyproject.toml 修改,必须手动运行 poetry lock --no-update 才能同步版本变更;否则 install 仍按旧 lock 文件安装,导致实际版本与 toml 不一致。

Poetry 能解决复杂依赖冲突,但前提是理解它“不自动响应 TOML 修改”的默认行为——改完 pyproject.toml 后不手动刷新锁文件,poetry install 就不会装你写的版本。
poetry install 为什么没装 pyproject.toml 里写的版本?
这不是 bug,是 Poetry 的确定性设计:它优先信任 poetry.lock 里的已解析结果,哪怕你把 requests = "^2.28" 改成了 requests = "2.28.2",只要旧 lock 里有满足 ^2.28 的版本(比如 2.28.1),它就直接复用,不重新解析。
- 常见错误现象:
poetry install后poetry show requests显示的是2.28.1,不是你 TOML 里写的2.28.2 - 根本原因:没运行
poetry lock --no-update强制同步 TOML 变更到 lock 文件 - 别用
poetry add requests@2.28.2—— 这会绕过 TOML 直接写 lock,导致两者不一致 - 想彻底重来?删掉
poetry.lock再跑poetry lock,但注意这会升级所有间接依赖,可能引入新冲突
CI 环境中如何确保依赖绝对一致?
本地能跑 ≠ CI 能跑,关键在 lock 文件是否被真实校验。Poetry 的确定性只对未篡改的 lock 成立,而 CI 环境通常无缓存、无历史解析痕迹,更容易暴露 TOML 和 lock 不同步的问题。
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
- CI 脚本第一行必须加:
poetry lock --check;失败说明有人提交了没更新 lock 的 TOML 修改 - 安装时用
poetry install --no-dev --no-root,避免因 dev 依赖缺失或 root 包声明不全引发隐式行为 - 禁用缓存:
POETRY_CACHE_DIR=/dev/null poetry install,尤其在容器化 CI 中,缓存不可靠 - 确认 CI 使用的 Poetry 版本和本地一致(如都用
1.7.1),不同大版本间解析器逻辑可能变化
冲突报错后怎么快速定位是哪个包拖后腿?
Poetry 的错误信息通常只说“因为 A 依赖 X>=2.0,B 依赖 Xpoetry show --tree 倒查依赖链。
- 先运行
poetry show --tree requests(把 requests 换成报错里提到的包名),看哪些上游包在拉高/拉低这个依赖 - 如果发现
scikit-learn在拖numpy升级,就给它也加版本锁:poetry add scikit-learn==1.2.2 - 避免用
--allow-prereleases:它会让解析器忽略你写的精确版本,转而选预发布版,测试环境极易崩 - 装不上指定版本?比如
poetry add numpy==1.23.5报 “doesn’t match any versions”,说明 PyPI 没对应 wheel,换成poetry add numpy@1.23.5强制源码编译
最常被忽略的点:锁文件不是“配置”,而是“快照”;它过期了就得重建,不能指望 Poetry 自动感知 TOML 的微小改动。每次改依赖,poetry lock --no-update 和 git commit -m "update lock after TOML change" 必须成对出现。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










