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
' 对额外安装的定义,这可能解释了为什么它的记录如此之少。
现在可以使用“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
,但上面的结果是我得到的。
对 Drachenfels 的答案投了赞成票。
\n开发依赖项不能是可选的,否则,无论您如何使用extras调整它或使用 重试poetry install -E
,它都永远不会被安装。
这听起来像是一个错误,但不知何故是设计的,
\n\n\n……这不是我想补充的。打包项目时,额外内容将在发行版元数据中引用,但开发依赖项不会引用,这将导致额外内容损坏。
\n
\xe2\x80\x94 在一位维护者的 Poetry PR#606 评论中得出结论。有关详细上下文,请参阅此处:https://github.com/python-poetry/poetry/pull/606#issuecomment-437943927
\n我想说我可以接受可选的开发依赖项无法实现的事实。然而,至少当我有这样的配置时,Poetry 应该警告我。如果是这样,我就不会困惑很长一段时间,阅读帮助手册的每个角落,却发现没有任何帮助。
\n我发现有些人确实陷入了这个问题(诗歌是否忽略了额外内容或 pyproject.toml 配置错误?),但他们的问题已关闭,标记为重复并重新链接到此问题。因此我决定在这里回答并提供有关此问题的更多详细信息。
\n我要补充的是,不仅您必须手动添加这个 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)