Подтвердить что ты не робот

Как указать диапазоны версий в install_requires (setuptools, distribute)

Я хочу, чтобы пакет зависел от конкретного диапазона версии, например. >= 0.5.0, < 0.7.0. Возможно ли это в опции install_requires, и если да, то как это должно быть?

4b9b3361

Ответ 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

Две дополнительные заметки.

  1. В документации также говорится, что избыточные/перекрывающиеся спецификации зависимостей будут объединены внутри, поэтому docutils >= 0.3, >=0.2 будут объединены в docutils >= 0.3.
  2. Кроме того, будьте осторожны при указании конфликтующих номеров версий, которые "бессмысленны и поэтому могут привести к странным результатам". Например, я не знаю, почему вы это сделаете, но не используйте это: 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.