标准答案

  1. CI 使用明确 Python 版本和锁定依赖安装,不能根据最新版本现场解析生产环境。
  2. pyproject 和构建后端要与 lockfile、wheel 产物保持一致。
  3. 科学计算、数据库驱动和加密库可能依赖系统库或编译工具,需要固定基础镜像。
  4. 升级依赖先做漏洞、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 以“自动拿到安全版本”。改正:先在构建流水线更新、测试并生成新制品,再发布已验证的固定制品。

作者信息