Python 诗篇——如何安装可选的依赖项?

Gra*_*rus 13 python python-poetry

Python 的诗歌依赖管理器允许通过命令指定可选的依赖:

$ poetry add --optional redis
Run Code Online (Sandbox Code Playgroud)

这导致此配置:

[tool.poetry.dependencies]
python = "^3.8"
redis = {version="^3.4.1", optional=true}
Run Code Online (Sandbox Code Playgroud)

但是,您如何实际安装它们?文档似乎暗示:

$ poetry install -E redis
Run Code Online (Sandbox Code Playgroud)

但这只是抛出和错误:

Installing dependencies from lock file

[ValueError]
Extra [redis] is not specified.
Run Code Online (Sandbox Code Playgroud)

Arn*_*rne 20

如果您想在安装期间使用该标志,则需要向您添加一个tool.poetry.extras组,如文档的本节所述:pyproject.toml-E

[tool.poetry.extras]
caching = ["redis"]
Run Code Online (Sandbox Code Playgroud)

键是指您与 一起使用的词,poetry install -E值是标记为--optional添加时的包的列表。当前不支持在添加过程中将可选包设为特定组的一部分,因此您必须pyproject.toml手动在文件中维护此部分。

这个额外的抽象层背后的原因是额外安装通常指的caching是通过安装一个或多个依赖项(在这种情况下只是redis)启用的一些可选功能(在这种情况下)。在这里poetry简单地模仿setuptools' 对额外安装的定义,这可能解释了为什么它的记录如此之少。

  • 对于任何收到“未指定额外内容”错误的人,您必须首先运行“诗歌更新”。 (6认同)
  • 从 ~v1.2 开始,`poetry install --all-extras` 将安装,你猜对了,所有额外的东西(回复@StefanFalk 的问题) (6认同)
  • 有没有一个简短的变体,所以安装_所有_额外的东西? (2认同)

0 0*_*0 0 9

现在可以使用“extras”组来实现这一点(对于 Poetry 版本 1.2;甚至可能是更早的版本):

poetry add redis --group=extras
Run Code Online (Sandbox Code Playgroud)

它将出现在该部分中

[tool.poetry.group.extras.dependencies]
Run Code Online (Sandbox Code Playgroud)

这也是较新的风格(与[tool.poetry.extras][tool.poetry.extras.dependencies]

请参阅文档。有趣的是,这仍然遵循旧的风格 ,[tool.poetry.extras]并且没有显示 的​​用法poetry add,但上面的结果是我得到的。


一年又*_*又一年 7

对 Drachenfels 的答案投了赞成票。

\n

开发依赖项不能是可选的,否则,无论您如何使用extras调整它或使用 重试poetry install -E,它都永远不会被安装。

\n

这听起来像是一个错误,但不知何故是设计的

\n
\n

……这不是我想补充的。打包项目时,额外内容将在发行版元数据中引用,但开发依赖项不会引用,这将导致额外内容损坏。

\n
\n

\xe2\x80\x94 在一位维护者的 Poetry PR#606 评论中得出结论。有关详细上下文,请参阅此处:https://github.com/python-poetry/poetry/pull/606#issuecomment-437943927

\n
\n

我想说我可以接受可选的开发依赖项无法实现的事实。然而,至少当我有这样的配置时,Poetry 应该警告我。如果是这样,我就不会困惑很长一段时间,阅读帮助手册的每个角落,却发现没有任何帮助。

\n
\n

我发现有些人确实陷入了这个问题(诗歌是否忽略了额外内容或 pyproject.toml 配置错误?),但他们的问题已关闭,标记为重复并重新链接到此问题。因此我决定在这里回答并提供有关此问题的更多详细信息。

\n


Dra*_*els 6

我要补充的是,不仅您必须手动添加这个 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"]
Run Code Online (Sandbox Code Playgroud)

但这起作用:

[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"]
Run Code Online (Sandbox Code Playgroud)