Поэзия: как публиковать пакеты проектов, ориентированные на несколько версий Python?

У меня есть один проект, который я хотел бы опубликовать как пакеты, ориентированные на две версии Python (3.6 и 3.8).

Что я понимаю:

  • Как установить и активировать разные версии Python с помощью pyenv.
  • Как заставить poetry создавать виртуальные среды, соответствующие выбранной версии Python.
  • Как настроить pyproject.toml для указания версии Python, управления зависимостями и публикации пакета с использованием этой конфигурации.

Чего я не понимаю: как я могу опубликовать один и тот же пакет для нескольких версий Python? Я не могу быть единственным, у кого есть этот вариант использования, верно?

  • Нужны два pyproject.toml файла? (по одному для каждой версии Python и набора соответствующих зависимостей ...)
  • Существуют ли устоявшиеся способы сделать это с помощью Poetry или необходимы другие инструменты / рабочие процессы?

Редактировать

Покопавшись немного, я нашел эту https://python-poetry.org/docs/versions/#multiple-constraints-dependencies, которая, похоже, может быть актуальной.

Вот пример по ссылке выше.

[tool.poetry.dependencies]
foo = [
    {version = "<=1.9", python = "^2.7"},
    {version = "^2.0", python = "^3.4"}
]

Я также обнаружил, что вы можете указать версию Python, используя poetry add вот так ...

poetry add cleo --python 3.6.10

Что добавляет зависимости в pyproject.toml вот так ...

cleo = {version = "^0.8.1", python = "3.6.10"}

Собираюсь поэкспериментировать и посмотреть, работает ли это.


person conner.xyz    schedule 28.01.2021    source источник
comment
Как сейчас ваш pyproject.toml?   -  person sinoroc    schedule 29.01.2021
comment
[tool.poetry.dependencies] python = ^ 3.8 cleo = ^ 0.8.1 ... [tool.poetry.dev-dependencies] pytest = ^ 5.4.3 ...   -  person conner.xyz    schedule 29.01.2021


Ответы (2)


Возможно, вам понадобится что-то подобное в вашем pyproject.toml:

[tool.poetry.dependencies]
python = '3.6 || 3.8'

Но я не уверен в точных обозначениях, они немного расплывчаты.

Кажется, создается setup.py со следующим:

'>=3.6, !=2.7.*, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.7.*'

Таким образом, это будет включать 3.9, 3.10 и т. Д., И это неверно.

person sinoroc    schedule 28.01.2021
comment
python = '>=3.6, != 3.7, <=3.8' тоже вроде не работает. - person sinoroc; 29.01.2021
comment
Хм, такое поведение мне не кажется правильным. Не могли бы вы открыть вопрос? - person finswimmer; 30.01.2021

Нет. Вам не нужно создавать несколько pyproject.toml файлов или иным образом создавать отдельные рабочие процессы для каждой версии Python, на которую вы нацеливаетесь (по крайней мере, для этой конкретной ситуации, ориентированной на аналогичные версии).

Вы можете просто использовать синтаксис зависимости, чтобы сказать, что вы хотите настроить таргетинг ›= 3.6‹ 4.0 вот так ...

[tool.poetry.dependencies]
python = '^3.6'

А затем аналогичным образом добавьте зависимости ...

poetry add <dependency> python ^3.6

В результате получается что-то вроде этого ...

[tool.poetry.dependencies]
python = '^3.6'
cleo = {version = "^0.8.1", python = "^3.6"}
pyyaml = {version = "^5.4.1", python = "^3.6"}
...

Это сработало, хотя я пошел дальше и сделал некоторые зависимости менее специфичными, чтобы избежать несовместимости на определенных хостах.

pyyaml = {version = "^5.0", python = "^3.6"}
...
person conner.xyz    schedule 02.02.2021