簡體   English   中英

poetry 根據附加功能安裝不同的 package 版本

[英]poetry install different package version based on extras

使用 python-poetry,我想根據我在安裝過程中傳遞的額外內容安裝不同的 package 版本。 例如我想

# when extra == 'a', install numpy == 1.20.0
$ poetry install -E a
# when extra == 'b', install numpy == 1.19.0
$ poetry install -E b

我嘗試使用以下 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"

但是當我做$ poetry install -E a我得到

  SolverProblemError

  Because demo-poetry depends on both numpy (1.20.0) and numpy (1.19.0), version solving failed.

我的詩歌版本是1.1.6

我認為詩歌中的臨時演員的概念和 pip 之間存在一些混淆。 Poetry extras是一組可以(可選)安裝在一起的包(例如math = ["numpy", "scipy"] )( poetry install -E math )。 它們類似於在預發行版 1.2.0a2中引入的組的概念。 However, pip extras are related only to one package, ie they are dependencies that you can install in addition to the regular dependencies of a package, if you ask for them explicitly (eg pip install ludwig[text] ).

確實可以使用環境標記作為依賴項的安裝條件。 但是, PEP-0508 環境標記定義中定義的附加內容與 pip 附加內容有關,而不是詩歌附加內容。 因此,詩歌附加內容不能用作限制安裝條件的環境標記。

使用附加組件或組(來自預發布)都不足以達到預期的結果。 在這方面,我認為@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"

您可以在不同的環境中安裝不同版本的 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)

這困擾着我的內部開發,雖然這非常令人沮喪,因為poetrycleo都沒有提供關於他們的 SDK 的任何文檔,但我終於設法為此創建了一個插件( pypigit )。

這個想法是,使用這個插件,您可以在組中有非互斥定義,並且當使用--without--only標志時,相關組將從依賴項解析中刪除。 該插件需要在任何此類組定義之前安裝。

通過poetry add poet-plugin安裝(如果從一個空的、干凈的項目開始,沒有這樣的依賴),或者通過:

poetry shell
pip install poet-plugin

我還沒有對此進行實戰測試,但它非常適合我們的用例,例如

poetry install --only prod
poetry install --only dev
poetry install --without dev
poetry install --without prod

歡迎反饋和更新等,希望這能暫時為我們中的一些人解決這個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM