如何在setuptools中对子依赖项施加版本约束?
如何用setuptools约束子依赖的版本?
背景
我的包依赖foo包,而foo又依赖bar包,版本要求是bar>=1.0.0——也就是说bar是我的包的子依赖。按照Python包管理的最佳实践,我的pyproject.toml(或setup.cfg)里只声明直接依赖,示例如下:
[project] # ... dependencies = [ "foo>=2.0", ]
问题
bar的1.0.1版本已经发布,修复了一个安全漏洞,但foo还没更新它的依赖要求(依然是bar>=1.0.0)。我不想等foo更新,想强制我的包必须使用bar>=1.0.1版本。
当前方案的不足
最直接的办法是把bar>=1.0.1加到pyproject.toml的依赖列表里,像这样:
[project] # ... dependencies = [ "foo>=2.0", # 约束子依赖版本 "bar>=1.0.1", ]
这方法确实能用,但问题是会让项目看起来直接依赖bar,可实际上我的代码根本没直接导入bar的内容——要是哪天foo不再依赖bar了,我的包也不需要它了,这种声明方式就会多余。
更好的解决方案:用setuptools的依赖约束功能
setuptools从61.0.0版本开始支持单独声明子依赖的约束,不需要把bar加到直接依赖里。
在pyproject.toml中配置
[project] # ... dependencies = [ "foo>=2.0", ] # 单独声明子依赖约束 [project.dependency-constraints] bar = ">=1.0.1"
在setup.cfg中配置
如果你用的是setup.cfg,可以这么写:
[options] dependencies = foo>=2.0 # 约束子依赖版本 [options.constraints] bar>=1.0.1
说明
这个约束会让pip(21.0及以上版本)在安装时,优先满足bar>=1.0.1的要求,哪怕foo只要求bar>=1.0.0。而且这个声明不会把bar标记为你的包的直接依赖,当foo不再依赖bar时,你的包也不会再安装bar,完美解决了之前的问题。
内容的提问来源于stack exchange,提问作者djvg
相关产品推荐
相关产品推荐

