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

如何在Poetry中同时将可选依赖声明为extras和专属依赖组?

Poetry依赖组与Extras:无需重复配置的优化方案

Poetry文档对依赖组(groups)与extras的区别有明确说明:

除隐式主依赖组外,其他依赖组仅可包含开发过程所需的依赖,且只能通过Poetry安装。若要声明可为项目运行时添加额外功能的依赖集合,请使用extras,终端用户可通过pip安装extras。

这套逻辑多数时候没问题,但开发阶段我们通常需要安装所有extras依赖来测试完整功能,可extras不会像依赖组那样默认安装。另外Poetry还有两条硬性规则:

为每个extras指定的依赖必须已在项目依赖中定义。
依赖组中列出的依赖无法被指定为extras。

受限于这些规则,开发者只能选两种不太理想的方案:

  • 每次安装都用poetry install --all-extras,但就算装了dev依赖组,也得手动加这个参数,很容易忘。
  • 在dev依赖组里重复写一遍extras的依赖,这会造成配置冗余,还可能因为版本不一致引发问题。

举个例子,这种重复配置的写法如下:

[tool.poetry.dependencies]
python = "^3.8,<3.12"
numpy = "^1.22"
scipy = { version = "^1.8", optional = true }

[tool.poetry.group.dev.dependencies]
scipy = "^1.8"

[tool.poetry.extras]
plot = ["scipy"]

这里plot extra依赖SciPy,按照要求已经在主依赖里声明为可选,但为了让开发环境自动装上,又得在dev组里再写一遍。

更简便的解决办法

1. 自定义Poetry安装脚本

在pyproject.toml里添加一个自定义脚本,把--with dev --all-extras的逻辑封装进去:

[tool.poetry.scripts]
install-dev = "poetry run poetry install --with dev --all-extras"

之后只需要运行poetry run install-dev,就能一键安装dev依赖组和所有extras依赖,不用再记复杂的参数。

2. 用变量统一版本(减少重复配置的风险)

如果还是需要在dev组里声明extras依赖,可以用Poetry的变量功能统一版本号,避免重复定义导致的版本不一致:

[tool.poetry.variables]
scipy-version = "^1.8"

[tool.poetry.dependencies]
python = "^3.8,<3.12"
numpy = "^1.22"
scipy = { version = "${scipy-version}", optional = true }

[tool.poetry.group.dev.dependencies]
scipy = "${scipy-version}"

[tool.poetry.extras]
plot = ["scipy"]

这样要修改版本时,只需要改scipy-version这一处即可。

3. 全局配置默认安装所有extras(谨慎使用)

如果你希望所有项目都默认安装extras,可以修改Poetry的全局配置:

poetry config installer.all-extras true

但这个会影响所有Poetry项目,适合个人开发环境,团队协作时不建议使用。

内容的提问来源于stack exchange,提问作者Louis Lac

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 14:15:02