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

如何在pyproject.toml中配置动态可选依赖,实现默认全量安装、指定分组仅装对应子模块依赖

如何在pyproject.toml中配置动态可选依赖,实现默认全量安装、指定分组仅装对应子模块依赖

我明白你现在卡在哪了——原来的配置里,你把两个模块的依赖都塞进主依赖组dependencies里了,pip的逻辑是不管你指定哪个可选依赖组,主依赖都会被强制安装,所以哪怕你只想要module1的依赖,module2的也会被顺带装上来,完全不是你想要的效果。

问题的核心根源在于:pip的运行逻辑是无论你指定哪个可选依赖组,主依赖dependencies中的内容都会被强制安装。你之前把两个模块的依赖都塞到主依赖里,自然会出现“选了module1却也装了module2”的问题。

要实现你要的效果,我们得调整配置逻辑,具体方案如下:

requires = ["setuptools", "setuptools-scm"]
build-backend = "setuptools.build_meta"

[project]
requires-python = ">=3.9"
name = "foobar"
dynamic = ["optional-dependencies"]
# 主依赖留空,不再包含任何模块的业务依赖
dependencies = []

[tool.setuptools.dynamic]
# 单独的module1依赖组,仅引用自身的需求文件
optional-dependencies.module1 = { file = ["module1/module1_requirements.txt"] }
# 单独的module2依赖组,仅引用自身的需求文件
optional-dependencies.module2 = { file = ["module2/module2_requirements.txt"] }
# 全量依赖组,包含两个模块的所有依赖
optional-dependencies.all = { file = ["module1/module1_requirements.txt", "module2/module2_requirements.txt"] }

# 关键配置:让默认安装(不指定任何extras时)自动安装all组
[tool.setuptools]
default-extras = ["all"]

这个配置的运行效果完全匹配你的需求:

  • 运行pip install .时,因为default-extras指定了all组,pip会自动安装全量依赖(module1+module2的需求都拉取),实现默认全量安装的效果。
  • 运行pip install .[module1]时,pip只会安装module1组对应的依赖,不会触发全量组,也不会安装module2的依赖,完美满足“指定分组仅装对应子模块依赖”的要求。

最后提个小注意点:这个方案需要你的setuptools版本在61.0.0及以上,因为default-extras这个配置项是从这个版本开始支持的,如果你的setuptools版本太低,记得先升级一下。

备注:内容来源于stack exchange,提问作者user1234352

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 18:54:49