如何在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
相关产品推荐
相关产品推荐

