Zastanawiam się, czy jest jakiś sposób, aby powiedzieć pipowi, szczególnie w pliku wymagań, aby zainstalował pakiet z wersją minimalną ( pip install package>=0.2
) i maksymalną, której nigdy nie należy instalować (teoretyczne API:) pip install package<0.3
.
Pytam, ponieważ korzystam z biblioteki innej firmy, która jest aktywnie rozwijana. Chciałbym, aby mój plik wymagań pip określał, że powinien on zawsze instalować najnowszą mniejszą wersję oddziału 0.5.x, ale nie chcę, aby pip kiedykolwiek próbował instalować nowsze wersje główne (jak 0.6.x) interfejs API jest inny. Jest to ważne, ponieważ chociaż gałąź 0.6.x jest dostępna, deweloperzy nadal udostępniają łatki i poprawki do gałęzi 0.5.x, więc nie chcę używać package==0.5.9
linii statycznej w pliku wymagań.
Czy istnieje jakiś sposób, aby to zrobić?
źródło
"package>=0.2,<=0.3"
nie ma to większego sensu: kiedy miałbyś rację zarówno z 0.2 jak i 0.3.0, ale nie z żadną z wydanych poprawek 0.3? Myślę, że"package>=0.2,<0.3"
jest to znacznie lepszy przykład, ponieważ odzwierciedla częsty przypadek powiedzenia: „proszę o podanie najnowszej wersji poprawki bieżącej wersji dodatkowej, ale nie uaktualniaj mnie automatycznie do następnej wersji dodatkowej, ponieważ chciałbym to zrobić wyraźnie, upewniając się, że nie dotyczą mnie żadne zmiany funkcjonalne ”.~=0.2
jest (imho) lepszym rozwiązaniem niż to.~=0.2.1
by się stało .>=0.2,<0.3
Dobrze jest być wyraźnie wyrażonym, ponieważ jest jasne, co się dzieje.~=0.2.1
w pliku wymagań. To błąd użytkownika, a nie wada~=
prefiksu.możesz także użyć:
który jest bardziej spójny i łatwy do odczytania.
źródło
requirements.txt
IMO. Użyciepackage==1.*
zamiastpackage>=1.2
uniemożliwia pipowi instalację głównej wersji 2+ dla pakietu, co jest pożądane, ponieważ zmiany głównych wersji są często niezgodne wstecz.Elegancką metodą byłoby użycie
~=
zgodnego operatora zwalniającego zgodnie z PEP 440 . W twoim przypadku oznaczałoby to:Na przykład, jeśli istnieją następujące wersje, wybrałby
0.5.9
:0.5.0
0.5.9
0.6.0
Dla wyjaśnienia, każda para jest równoważna:
źródło
2.2
planowana przyszłość2.2.1
, czy~=2.2.*
pasuje,2.2
mimo że nie ma trzeciego numeru?~=2.2.0
w takim przypadku (*
operator nie będzie działać, jeśli używasz~=
).2.2
i2.2.0
(i2.2.0.0
tak dalej) są wewnętrznie traktowane tak samo, jeśli chodzi o instalowanie pakietów.~=1.2.3
. Zamiast tego korzystanie z formularza złożonego z wielu klauzul jest o wiele bardziej wyraźne i jaśniejsze.== 1.*
nieprawidłowo zaakceptuje wersję 1.1.0. Operator~=
(lub>=
plus,<
jeśli uważasz, że jest to trudne do odczytania) jest lepszy, ponieważ zachęca do bycia poprawnie określonym.== 1.*
powiodłoby się i nic nie zrobiłoby, gdybyśmy potrzebowali funkcji wersji 1.2, ale użytkownik miał już zainstalowany 1.1. Twoja propozycja~= 1.2
jest taka sama jak powiedzenie>= 1.2, < 2.0
(lub>= 1.2, == 1.*
). Więc tak, masz rację,~=
jest najlepszym operatorem, ponieważ pozwala ci kierować wersję programistyczną, której używałeś biblioteki, jednocześnie pozwalając na nowsze wersje w tej samej głównej wersji. Dzięki za wyjaśnienie!