Для чего нужны требования setuptools вида "package===version"
Скажем, у меня есть пакет с консольным скриптом, таким как
from setuptools import setup
setup(
name='eg_package',
version='0.0.1',
description='Trivial test package',
packages=[
'eg_package',
],
entry_points={
'console_scripts': [
'foo = eg_package.main:main',
]
},
)
Если я установил и явный тег сборки, используя egg_info -b mytag
полученный скрипт имеет __requires__ = 'eg-package===0.0.1mytag'
с 3 "=" знаками. Это происходит, когда тег не похож на обычный b1
для бета-версии.
Сначала я думал, что это ошибка, но документация по setuptools предполагает, что это допустимый идентификатор требования. Тем не менее, он не работает со старыми версиями setuptools, что вызывает проблемы с нашими системами.
Мой вопрос в том, что делает "==="
значит и почему современный setuptools
используй это?
1 ответ
Раздел спецификатора требований в pip
документы ссылки на официальные документы для спецификаторов требований, реализуемых setuptools
pkg_resources
, Он определяет формальный синтаксис, но ничего не говорит о семантике. Обзорные документы объясняют семантику, но ничего не говорят о ~=
а также ===
вещи, которые, очевидно, были добавлены где-то между vv.7 (установлен с python 2.7.9) и 16.
Когда документы не работают, пришло время обратиться к источникам. Скачиваем setuptools hg репо и комментируем pkg_resources/__init__.py
в конечном итоге мы получаем набор изменений 3125 с сообщением "Внедрите PEP 440 с помощью библиотеки упаковки".
Действительно, PEP 440, раздел " Спецификаторы версий", объясняет синтаксис и семантику:
- ~ =: Предложение о совместимости выпуска <...>
- ===: Положение о произвольном равенстве.
Изучая другие файлы в коммите и связанные с ним packaging
Пакет, я пришел к этим очевидным выводам:
~=
никогда не производится; при обработке 1 он действует как фильтр в соответствии с правилами, изложенными в PEP.===
, когда обрабатываются, сигналы отступить к старшемуsetuptools
синтаксис версии и логика сравнения. Он создается всякий раз, когда полученная строка версии не соответствует PEP 2.
1 В pkg_resources._vendor.packaging.specifiers._compare_compatible()
2 pkg_resources.parse_version()
производит pkg_resources.SetuptoolsLegacyVersion
скорее, чем pkg_resources.SetuptoolsVersion