Я хочу, чтобы пакет зависел от конкретного диапазона версии, например. >= 0.5.0, < 0.7.0
. Возможно ли это в опции install_requires
, и если да, то как это должно быть?
Как указать диапазоны версий в install_requires (setuptools, distribute)
Ответ 1
Согласно документации, ваш синтаксис должен работать правильно. В документации говорится, что:
setuptools
иpkg_resources
используют общий синтаксис для определения требуемых зависимостей проекта. Этот синтаксис состоит из имени PyPI проекта, за которым, возможно, следует разделенный запятыми список "лишних" в квадратных скобках, за которым, возможно, следует разделенный запятыми список спецификаторов версии. Спецификатор версии - это один из операторов <,>, <=,> =, == или! =, За которым следует идентификатор версии.
Документация дает простой пример, подобный этому:
docutils >= 0.3
# comment lines and \ continuations are allowed in requirement strings
BazSpam ==1.1, ==1.2, ==1.3, ==1.4, ==1.5, \
==1.6, ==1.7 # and so are line-end comments
docutils
того, если вы хотите, чтобы вашему пакету требовалась версия docutils
больше, чем версия 0.3, но меньше, чем версия 0.5, такой код будет работать:
docutils >= 0.3, <=0.5
Две дополнительные заметки.
- В документации также говорится, что избыточные/перекрывающиеся спецификации зависимостей будут объединены внутри, поэтому
docutils >= 0.3, >=0.2
будут объединены вdocutils >= 0.3
. - Кроме того, будьте осторожны при указании конфликтующих номеров версий, которые "бессмысленны и поэтому могут привести к странным результатам". Например, я не знаю, почему вы это сделаете, но не используйте это:
docutils >= 0.3, <=0.2
поскольку это невозможно.
Ответ 2
Будьте осторожны с недобровольными бета-тестами. Сторонники пакетов иногда выпускают несовместимые, неполные или разбитые версии a, b и c для общих аудиторий без предупреждения. В следующий раз, когда вы запустите setup.py в новом virtualenv, вы можете вытащить одну из этих отравленных яиц, и внезапно ваша программа сломается.
Чтобы уменьшить этот риск, не использовать объявление стиля foo >=0.3, <0.4
, которое имеет чисто числовую верхнюю границу. <0.4
по-прежнему допускает версии 0.4a0, 0.4a1, 0.4b0, 0.4c3 и т.д. Вместо этого используйте верхнюю границу, такую как <0.4a0
, как в foo >=0.3, <0.4a0
, когда вы пишете install_requires.
Когда setuptools делает что-то неожиданное, попробовав использовать verlib, чтобы смоделировать сравнение версий. Verlib довольно хорошо подходит, пока ваши версии нормализованы и не противоречат друг другу. Вот пример, демонстрирующий потенциально контринтуитивное упорядочение нормализованных версий:
#!/usr/bin/env python
from verlib import NormalizedVersion as V
assert (V("0.7.9") < V("0.8a0") < V("0.8a1") < V("0.8b0") < V("0.8b1")
< V("0.8b2") < V("0.8.0") < V("0.8.1a0") < V("0.8.1") < V("0.9")
< V("1.0a3") < V("1.0b2") < V("1.0b20") < V("1.0c0") < V("1.0")
< V("1.0.1"))
assert (V("0.7.9") < V("0.8.0a0") < V("0.8.0a1") < V("0.8.0b0")
< V("0.8.0b1") < V("0.8.0b2") < V("0.8.0") < V("0.8.1a0") < V("0.8.1")
< V("0.9") < V("1.0a3") < V("1.0b2") < V("1.0b20") < V("1.0c0")
< V("1.0") < V("1.0.1"))
print "Version comparisons are sane."
Ответ 3
Еще один способ это использовать подстановочные знаки.
Это не относится к> = 0.5.0, <0.7.0, но если вы решите, что должны поддерживаться все выпуски поддержки (например, 0.5.0 до 0.5.x), вы можете использовать
== 0.5. *
например, документирование == 0,3. *
Ответ 4
Обозначение, упомянутое в вопросе OP, >= 0.5.0, < 0.7.0
, уже работает.
И, поскольку многие (если не большинство) из библиотек уже используют семантическое управление версиями, поэтому по определению вы можете определить свою зависимость как A>=1,<2
, как описано здесь. И они даже реализовали еще более простой синтаксис для него, A~=XY
, что означает, что он требует по крайней мере выпуска XY, но также допускает любой более поздний выпуск с соответствующей версией MAJOR.