You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 21:35:14