[英]Python poetry - how to install optional dependencies?
Python 的诗歌依赖管理器允许通过命令指定可选依赖项:
$ poetry add --optional redis
这导致了这种配置:
[tool.poetry.dependencies]
python = "^3.8"
redis = {version="^3.4.1", optional=true}
但是,您如何实际安装它们? 文档似乎暗示:
$ poetry install -E redis
但这只是抛出和错误:
Installing dependencies from lock file
[ValueError]
Extra [redis] is not specified.
如果您想在安装期间使用-E
标志,您需要将tool.poetry.extras
组添加到您的pyproject.toml
,如文档的本节所述:
[tool.poetry.extras]
caching = ["redis"]
键是指您与poetry install -E
一起使用的词,值是添加时标记为--optional
的包的列表。 当前不支持在添加过程pyproject.toml
可选包作为特定组的一部分,因此您必须手动在pyproject.toml
文件中维护此部分。
这个额外的抽象层背后的原因是额外安装通常指的是通过安装一个或多个依赖项(在这种情况下只是redis
)启用的一些可选功能(在这种情况下是caching
)。 poetry
在这里简单地模仿了setuptools
对额外安装的定义,这可能解释了为什么它的文档如此之少。
我要补充的是,不仅您必须手动添加这个 extras 部分,而且您的可选依赖项不能在 dev 部分中。
的代码示例将无法正常工作:
[tool.poetry]
name = "yolo"
version = "1.0.0"
description = ""
authors = []
[tool.poetry.dependencies]
python = "2.7"
Django = "*"
[tool.poetry.dev-dependencies]
pytest = "*"
ipdb = {version = "*", optional = true}
[tool.poetry.extras]
dev_tools = ["ipdb"]
但这将起作用:
[tool.poetry]
name = "yolo"
version = "1.0.0"
description = ""
authors = []
[tool.poetry.dependencies]
python = "2.7"
Django = "*"
ipdb = {version = "*", optional = true}
[tool.poetry.dev-dependencies]
pytest = "*"
[tool.poetry.extras]
dev_tools = ["ipdb"]
投票赞成 Drachenfels 的回答。
开发依赖不能是可选的,否则,无论您如何使用附加功能调整它或使用poetry install -E
重试,它都永远不会安装。
这听起来像一个错误,但不知何故是设计使然,
...这不是我要添加的内容。 打包项目时,将在分发元数据中引用 Extras,但开发依赖项不会,这将导致 Extras 损坏。
— 一位维护者在 Poetry PR#606 评论中得出结论。 有关详细信息,请参见此处: https://github.com/python-poetry/poetry/pull/606#issuecomment-437943927
我会说我可以接受无法实现可选开发依赖的事实。 但是,当我有这样的配置时,至少 Poetry 应该警告我。 如果是这样,我就不会困惑很长时间,阅读帮助手册的每个角落并没有发现任何帮助。
我发现有些人确实陷入了这个问题( 诗歌是否忽略了额外内容或 pyproject.toml 配置错误? )但他们的问题已关闭,标记为重复并重新链接到此问题。 因此,我决定在这里回答并提供有关此问题的更多详细信息。
现在可以使用“附加”组(使用 Poetry 版本 1.2;甚至可能是更早的版本):
poetry add redis --group=extras
它将出现在部分
[tool.poetry.group.extras.dependencies]
这也是较新的风格(与[tool.poetry.extras]
或[tool.poetry.extras.dependencies]
请参阅文档。 有趣的是,这仍然遵循旧样式[tool.poetry.extras]
,并且没有显示使用poetry add
,但上面的结果是我得到的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.