Python poetry - 如何安装可选依赖项?
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
,如文档 this section 中所述:
[tool.poetry.extras]
caching = ["redis"]
键指的是您与 poetry install -E
一起使用的词,值是添加时标记为 --optional
的包列表。目前有 no support 用于在添加过程中使可选包成为特定组的一部分,因此您必须在 pyproject.toml
文件中手动维护此部分。
这一额外抽象层背后的原因是,额外安装通常指的是通过安装一个或多个依赖项(在本例中只是redis
)。 poetry
在这里只是模仿 setuptools
' definition of extra-installs,这也许可以解释为什么它的记录如此少。
我要补充一点,不仅你必须手动添加这个 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"]
Up-voted Drachenfels 的回答。
Dev 依赖项不能是可选的,否则,无论您如何使用 extras 进行调整或使用 poetry install -E
重试, 它永远不会被安装。
这听起来像是一个错误 但不知为何是设计使然,
...this is not something I want to add. Extras will be referenced in the distributions metadata when packaging the project but development dependencies do not which will lead to a broken extras.
— 一位维护者在 Poetry PR#606 评论中总结道。有关详细上下文,请参阅此处:https://github.com/python-poetry/poetry/pull/606#issuecomment-437943927
我会说我可以接受可选的 dev-dependency 无法实现的事实。但是,至少当我有这样的配置时,Poetry 应该警告我。如果是这样,我就不会迷茫了半天,把帮助手册的各个角落都翻了个遍,一点帮助也没有。
我发现有些人确实陷入了这个问题 (Is poetry ignoring extras or pyproject.toml is misconfigured?),但他们的问题已关闭,标记为重复并且 re-linked 到这个问题。因此,我决定在这里回答并提供有关此问题的更多详细信息。
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
,如文档 this section 中所述:
[tool.poetry.extras]
caching = ["redis"]
键指的是您与 poetry install -E
一起使用的词,值是添加时标记为 --optional
的包列表。目前有 no support 用于在添加过程中使可选包成为特定组的一部分,因此您必须在 pyproject.toml
文件中手动维护此部分。
这一额外抽象层背后的原因是,额外安装通常指的是通过安装一个或多个依赖项(在本例中只是redis
)。 poetry
在这里只是模仿 setuptools
' definition of extra-installs,这也许可以解释为什么它的记录如此少。
我要补充一点,不仅你必须手动添加这个 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"]
Up-voted Drachenfels 的回答。
Dev 依赖项不能是可选的,否则,无论您如何使用 extras 进行调整或使用 poetry install -E
重试, 它永远不会被安装。
这听起来像是一个错误 但不知为何是设计使然,
...this is not something I want to add. Extras will be referenced in the distributions metadata when packaging the project but development dependencies do not which will lead to a broken extras.
— 一位维护者在 Poetry PR#606 评论中总结道。有关详细上下文,请参阅此处:https://github.com/python-poetry/poetry/pull/606#issuecomment-437943927
我会说我可以接受可选的 dev-dependency 无法实现的事实。但是,至少当我有这样的配置时,Poetry 应该警告我。如果是这样,我就不会迷茫了半天,把帮助手册的各个角落都翻了个遍,一点帮助也没有。
我发现有些人确实陷入了这个问题 (Is poetry ignoring extras or pyproject.toml is misconfigured?),但他们的问题已关闭,标记为重复并且 re-linked 到这个问题。因此,我决定在这里回答并提供有关此问题的更多详细信息。