如何让pip-compile生成的requirements文件统一moduleC为1.1.0?
解决Python项目多requirements文件依赖版本不一致问题
我有一个依赖moduleA和moduleB的Python项目,对应的pyproject.toml配置如下:
[project] name = "meta-motor" version = "3.1.0.dev" dependencies = [ "moduleA==1.0.0" ] [project.optional-dependencies] dev = [ "moduleB==1.0.0" ]
其中moduleA依赖moduleC>=1.0.0,moduleB依赖moduleC==1.1.0。通过以下命令编译requirements.txt和dev-requirements.txt:
$ pip-compile -o requirements.txt pyproject.toml $ pip-compile --extra dev -o dev-requirements.txt pyproject.toml
生成的文件内容如下:
requirements.txt
moduleA==1.0.0 # via pyproject.toml moduleC==1.2.0 # via moduleA
dev-requirements.txt
moduleB==1.0.0 # via pyproject.toml moduleA==1.0.0 # via pyproject.toml moduleC==1.1.0 # via # moduleB # moduleA
可见两个requirements文件中moduleC的版本不一致,希望两个文件中的moduleC均为1.1.0,但手动在pyproject.toml中指定moduleC==1.1.0在大型项目中并不现实,解决方法如下:
方案一:使用约束文件统一依赖版本
先基于dev环境的依赖生成约束文件(该文件会包含所有依赖的兼容版本交集),再用该约束文件编译生产环境的requirements,强制生产环境遵循统一的版本:
# 生成包含所有依赖约束的基准文件 pip-compile --extra dev -o constraints.txt pyproject.toml # 编译生产环境requirements时,引入约束文件锁定版本 pip-compile --constraint constraints.txt -o requirements.txt pyproject.toml # 重新编译dev环境requirements(确保与约束一致) pip-compile --extra dev -o dev-requirements.txt pyproject.toml
这样生产环境的moduleC会被约束为1.1.0,因为该版本同时满足moduleA(>=1.0.0)和moduleB(==1.1.0)的依赖要求,pip-compile会优先遵循约束文件中的版本。
方案二:通过pyproject.toml添加隐性版本约束
如果不想额外维护约束文件,可以在生产环境的依赖中添加对moduleC的范围约束,比如将dependencies修改为:
dependencies = [ "moduleA==1.0.0", "moduleC>=1.0.0,<1.2" ]
这种方式能限制生产环境的moduleC最高版本不超过1.2.0,从而和dev环境的1.1.0保持一致。不过相比约束文件,这种方式灵活性稍差,大型项目更推荐用约束文件的方式,便于统一管理所有依赖的版本基准。
内容的提问来源于stack exchange,提问作者Kins
相关产品推荐
相关产品推荐

