标准答案
- CI 使用明确 Python 版本和锁定依赖安装,不能根据最新版本现场解析生产环境。
- pyproject 和构建后端要与 lockfile、wheel 产物保持一致。
- 科学计算、数据库驱动和加密库可能依赖系统库或编译工具,需要固定基础镜像。
- 升级依赖先做漏洞、API、性能和回滚验证,保留旧制品。
题目解析
可复现安装的目标不是让每台机器都执行同一条 pip 命令,而是让解释器版本、依赖解析结果、构建工具和系统运行库都能被重新得到。pyproject.toml 负责声明项目元数据和约束,uv.lock、poetry.lock 或由 pip-tools 生成的固定依赖文件负责记录具体解析结果,两者的职责不能混为一谈。
纯 Python wheel 通常只受 Python 版本影响,而 psycopg、cryptography、numpy 等包可能还受平台、CPU、C ABI 和系统库影响。生产环境应尽量安装已经验证过的 wheel 或构建制品,并固定基础镜像;如果必须源码编译,就要把编译器和系统开发包纳入构建过程,而不是依赖运行时临时安装。
验证时应在干净环境从锁文件安装,记录 Python 小版本、操作系统、架构和最终制品摘要,并运行启动、迁移和关键接口测试。升级只改变一组可回滚的输入,不能让生产环境在启动时自行重新解析依赖。
常见误区
- 误区:把 requirements.txt 里几个直接依赖的版本当成完整锁定。改正:同时固定间接依赖、Python 版本、基础镜像和原生库,使用项目实际采用的 lockfile 安装。
- 误区:开发机可以编译就认为生产镜像也可以。改正:在与生产相同的基础镜像中构建 wheel,并把编译工具与运行时依赖分开。
- 误区:部署时执行 pip install -U 以“自动拿到安全版本”。改正:先在构建流水线更新、测试并生成新制品,再发布已验证的固定制品。