诗歌根据额外内容安装不同的软件包版本

ten*_*con 7 python python-poetry

使用 python-poetry,我想根据安装过程中传递的额外内容安装不同的软件包版本。例如我想

# when extra == 'a', install numpy == 1.20.0
$ poetry install -E a
# when extra == 'b', install numpy == 1.19.0
$ poetry install -E b
Run Code Online (Sandbox Code Playgroud)

我尝试使用以下 toml 文件

[tool.poetry]
name = "demo-poetry"
version = "0.1.0"
description = ""
authors = ["tenticon"]

[tool.poetry.dependencies]
python = "^3.8"
numpy = [
    { version = "1.20.0", markers = "extra == 'a'", optional = true},
    { version = "1.19.0", markers = "extra == 'b'", optional = true}
]

[tool.poetry.extras]
a = [ "numpy" ]
b = [ "numpy" ]

[tool.poetry.dev-dependencies]
pytest = "^5.2"

[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"
Run Code Online (Sandbox Code Playgroud)

但当我这样做时$ poetry install -E a我得到

  SolverProblemError

  Because demo-poetry depends on both numpy (1.20.0) and numpy (1.19.0), version solving failed.
Run Code Online (Sandbox Code Playgroud)

我的诗歌版本是1.1.6

vre*_*pue 3

Poetry extras是一组包(例如a = ["numpy", "scipy"]),可以选择与主要依赖项(poetry install -E a)一起安装。当安装或指定诗歌构建的包时,可以按照PEP-508 extras 定义中的描述激活 toml 文件中定义的 extras 。a因此,可以使用 extra所需的依赖项进行安装(就像任何其他pip extraspip install demo-poetry[a]一样)。

确实可以使用环境标记作为依赖项的安装条件(请参阅PEP-508 环境标记列表)。但是,在编写本文时,相关函数未返回extra环境标记,因此它被忽略为安装约束。PEP-508 文档还指出该变量很特殊,并且当前没有针对它的规范。 get_marker_env()extra

使用 extras 或 groups(来自预发行版 1.2.0a2)都不足以达到预期结果。在这方面,我认为 @finswimmer 的评论是正确的:组不是相互排斥的,但诗歌检查依赖性解析在每种情况下都有效。

我能得到的最接近可接受的解决方案是根据 python 版本或平台定义条件。请注意,这些条件应始终是互斥的,否则您将收到错误。

例如,如果您有以下内容pyproject.toml

[tool.poetry]
name = "demo-poetry"
version = "0.1.0"
description = ""
authors = ["vreyespue"]

[tool.poetry.dependencies]
numpy = [
    { version = "1.19.0", python = "~3.7"},
    { version = "1.20.0", python = "~3.9"}
]

[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"
Run Code Online (Sandbox Code Playgroud)

您可以在不同的环境中安装不同版本的numpy

$ poetry env use 3.7
  Using virtualenv: /***/demo-poetry-***-py3.7

$ poetry install
  Installing numpy (1.19.0)

$ poetry env use 3.9
  Using virtualenv: /***/demo-poetry-***-py3.9

$ poetry install
  Installing numpy (1.20.0)
Run Code Online (Sandbox Code Playgroud)