Ich frage mich, ob es eine Möglichkeit gibt, pip, insbesondere in einer Anforderungsdatei, anzuweisen, ein Paket mit einer minimalen Version ( pip install package>=0.2
) und einer maximalen Version zu installieren, die niemals installiert werden sollten (theoretische API :) pip install package<0.3
.
Ich frage, weil ich eine Drittanbieter-Bibliothek verwende, die sich in der aktiven Entwicklung befindet. Ich möchte, dass in meiner Pip-Anforderungsdatei angegeben wird, dass immer die neueste Nebenversion des 0.5.x-Zweigs installiert werden soll, aber ich möchte nicht, dass Pip seitdem versucht, neuere Hauptversionen (wie 0.6.x) zu installieren Die API ist anders. Dies ist wichtig, da die Entwickler, obwohl der Zweig 0.6.x verfügbar ist, immer noch Patches und Bugfixes für den Zweig 0.5.x veröffentlichen, sodass ich package==0.5.9
in meiner Anforderungsdatei keine statische Zeile verwenden möchte .
Gibt es eine Möglichkeit, das zu tun?
quelle
"package>=0.2,<=0.3"
macht nicht viel Sinn: Wann wären Sie mit 0.2 und 0.3.0 einverstanden, aber nicht mit einer der Bugfix-Versionen von 0.3? Ich denke, dies"package>=0.2,<0.3"
ist ein viel besseres Beispiel, da es den üblichen Fall widerspiegelt: "Bitte geben Sie mir die neueste Bugfix-Version der aktuellen Nebenversion, aber aktualisieren Sie mich nicht automatisch auf die nächste Nebenversion, da ich dies gerne tun würde." das explizit, um sicherzustellen, dass es keine funktionalen Änderungen gibt, die mich betreffen. "~=0.2
Achten Sie darauf, es zu überprüfen, ist (imho) eine bessere Lösung als diese.~=0.2.1
zum Beispiel tun würde. Es>=0.2,<0.3
ist gut, explizit zu sein , denn es ist wirklich klar, was passiert.~=0.2.1
in eine Anforderungsdatei schreiben . Das ist ein Benutzerfehler, kein Nachteil des~=
Präfixes.Sie können auch verwenden:
Das ist konsistenter und leicht zu lesen.
quelle
requirements.txt
IMO zu verwalten . Die Verwendung vonpackage==1.*
anstelle vonpackage>=1.2
verhindert, dass pip die Hauptversion 2+ für das Paket installiert, was wünschenswert ist, da Änderungen der Hauptversion häufig abwärtskompatibel sind.Eine elegante Methode wäre die Verwendung des
~=
kompatiblen Release-Operators gemäß PEP 440 . In Ihrem Fall würde dies betragen:Wenn beispielsweise die folgenden Versionen vorhanden sind, wird Folgendes ausgewählt
0.5.9
:0.5.0
0.5.9
0.6.0
Zur Verdeutlichung ist jedes Paar gleichwertig:
quelle
2.2
und eine geplante Zukunft gibt2.2.1
, wird sie~=2.2.*
übereinstimmen,2.2
obwohl es keine Tertiärzahl gibt?~=2.2.0
in diesem Fall verwenden (*
Operator funktioniert nicht, wenn Sie verwenden~=
).2.2
und2.2.0
(und2.2.0.0
usw.) werden intern bei der Installation von Paketen intern genauso behandelt.~=1.2.3
. Es ist viel expliziter und klarer, stattdessen das Mehrklauselformular zu verwenden.== 1.*
wird Version 1.1.0 nicht ordnungsgemäß akzeptiert. Der Operator~=
(oder das>=
Plus,<
wenn Sie das schwer zu lesen finden) ist besser, weil er die korrekte Spezifität fördert.== 1.*
scheitern würde und nichts zu tun , wenn wir eine Version 1.2 Features , aber die Benutzer müssen bereits hatte 1.1 installiert. Ihr Vorschlag entspricht~= 1.2
dem Sprichwort>= 1.2, < 2.0
(oder>= 1.2, == 1.*
). Also ja, Sie haben Recht,~=
ist der beste Operator, da Sie damit auf die von Ihnen verwendete Entwicklungsversion einer Bibliothek abzielen und gleichzeitig neuere Versionen in derselben Hauptversion zulassen können. Danke für diese Klarstellung!