Мне интересно, есть ли способ указать pip, в частности, в файле требований, установить пакет с минимальной версией ( pip install package>=0.2
) и максимальной версией, которую никогда не следует устанавливать (теоретический api:) pip install package<0.3
.
Я спрашиваю, потому что я использую стороннюю библиотеку, которая находится в активной разработке. Я хотел бы, чтобы в моем файле требований к pip всегда указывался последний вспомогательный выпуск ветки 0.5.x, но я не хочу, чтобы pip пытался установить какие-либо более новые основные версии (например, 0.6.x), так как API отличается. Это важно, потому что хотя ветка 0.6.x доступна, разработчики все еще выпускают исправления и исправления ошибок для ветки 0.5.x, поэтому я не хочу использовать статическую package==0.5.9
строку в моем файле требований.
Есть ли способ сделать это?
источник
"package>=0.2,<=0.3"
, не имеет особого смысла: когда вы будете в порядке с 0.2 и 0.3.0, но не с какими-либо выпусками исправлений ошибок 0.3? Я думаю, что"package>=0.2,<0.3"
это гораздо лучший пример, потому что он отражает распространенный случай: «Пожалуйста, дайте мне последний выпуск исправлений текущей минорной версии, но не обновляйте меня автоматически до следующей минорной версии, потому что я хотел бы сделать это явно, убедившись, что нет никаких функциональных изменений, влияющих на меня. "~=0.2
(imho) лучшее решение, чем это.~=0.2.1
будет делать, например. Быть явным, как в>=0.2,<0.3
, это хорошая вещь, потому что действительно ясно, что происходит.~=0.2.1
в файл требований. Это ошибка пользователя, а не недостаток~=
префикса.Вы также можете использовать:
который является более последовательным и легко читаемым.
источник
requirements.txt
ИМО. Использованиеpackage==1.*
вместоpackage>=1.2
препятствует установке pip основной версии 2+ для пакета, что является желательным, поскольку изменения в основной версии часто обратно несовместимы.Элегантным способом было бы использовать
~=
совместимый оператор освобождения в соответствии с PEP 440 . В вашем случае это составит:Например, если существуют следующие версии, он выберет
0.5.9
:0.5.0
0.5.9
0.6.0
Для пояснения каждая пара эквивалентна:
источник
2.2
и запланированное будущее2.2.1
, будет ли~=2.2.*
совпадать,2.2
несмотря на отсутствие третичного числа?~=2.2.0
в этом случае (*
оператор не будет работать, если вы используете~=
).2.2
и2.2.0
(и2.2.0.0
так далее) внутренне обрабатываются как одна и та же вещь, когда дело доходит до установки пакетов.~=1.2.3
. Вместо этого гораздо яснее и понятнее использовать форму с несколькими предложениями.== 1.*
неправильно примет v1.1.0. Оператор~=
(или>=
плюс,<
если вам трудно это читать) лучше, потому что он поощряет быть точным.== 1.*
что не получится и ничего не будет делать, если нам понадобится функция версии 1.2, но у пользователя уже установлена версия 1.1. Ваш предложенный~= 1.2
- то же самое, что сказать>= 1.2, < 2.0
(или>= 1.2, == 1.*
). Так что да, вы правы,~=
это лучший оператор, так как он позволяет вам ориентироваться на версию разработки, которую вы использовали для библиотеки, и в то же время разрешать более новые версии в той же основной версии. Спасибо за это разъяснение!