Pip安装:构建wheel包时如何锁定Python依赖库的指定版本
问题:如何强制pip在构建wheel包时使用指定版本的依赖包?
问题背景
现有Python项目已在setup.py及依赖配置中锁定全部依赖版本,精简后的依赖配置如下:
cffi==1.15.0 <some_other_pkg>==1.0.0 <lots of other packages>
执行pip install -r requirements.pip流程时,pip为some_other_pkg构建wheel的环节自动拉取使用了cffi==1.15.1,不符合版本锁定预期。由于部署服务器环境无法兼容cffi==1.15.1,版本不匹配会直接导致服务运行异常。当前环境技术栈为Python3、virtualenv、pip、setuptools,需要配置pip使其在wheel构建环节也遵循指定的cffi==1.15.0版本要求。
问题根源
这个现象是pip默认遵循PEP 517规范的构建隔离机制导致的:pip为每个需要源码编译构建wheel的包创建独立的临时构建环境,该环境仅读取当前待构建包自身声明的构建依赖版本范围,不会同步读取项目全局锁定的依赖版本。如果待构建包声明的构建依赖是cffi>=1.xx这类开放范围,pip就会在临时构建环境中拉取符合范围的最新版本,最终出现构建环节依赖版本和全局锁定版本不一致的问题。
可落地方案
按侵入性从低到高排序,可选择以下任意一种方案解决:
- 方案1:使用约束文件强制全链路版本锁定(推荐)
新建约束文件(例如命名为constraints.txt),写入需要强制锁定的构建依赖版本:
安装依赖时通过cffi==1.15.0-c参数加载约束文件即可,pip的新解析器(pip 20.3及以上版本默认启用)会将约束规则应用到所有依赖解析场景,包括临时构建环境内的依赖安装,不会再拉取不符合版本要求的包:
该方案不需要关闭构建隔离,也不需要提前预装依赖,对现有安装流程改动最小。pip install -c constraints.txt -r requirements.pip - 方案2:提前预装构建依赖+关闭构建隔离
先在激活的virtualenv环境中提前安装锁定版本的构建依赖:
安装剩余依赖时传入pip install cffi==1.15.0--no-build-isolation参数,关闭pip的独立构建隔离环境,pip会直接复用当前虚拟环境中已安装的依赖完成wheel构建,自然会使用提前装好的1.15.0版本cffi:pip install --no-build-isolation -r requirements.pip注意:使用该方案必须提前在环境中装齐所有待安装包的构建依赖,否则构建过程会报缺依赖错误。
- 方案3:全局pip配置固定约束规则
如果需要在环境中固定该版本规则,避免每次安装都传参数,可以修改对应virtualenv环境下的pip.conf配置,添加如下内容:
配置生效后所有[install] constraints = /absolute/path/to/your/constraints.txtpip install操作都会自动加载约束文件的版本规则,构建环节也不会拉取不符合要求的依赖版本。
内容的提问来源于stack exchange,提问作者maximum-warning
相关产品推荐
相关产品推荐

