Je me demande s'il existe un moyen de dire à pip, spécifiquement dans un fichier d'exigences, d'installer un package avec à la fois une version minimale ( pip install package>=0.2
) et une version maximale qui ne devrait jamais être installée (api théorique:) pip install package<0.3
.
Je demande parce que j'utilise une bibliothèque tierce qui est en développement actif. J'aimerais que mon fichier d'exigences pip spécifie qu'il doit toujours installer la version mineure la plus récente de la branche 0.5.x, mais je ne veux pas que pip essaie d'installer des versions majeures plus récentes (comme 0.6.x) depuis l'API est différente. Ceci est important car même si la branche 0.6.x est disponible, les développeurs publient toujours des correctifs et des corrections de bogues dans la branche 0.5.x, donc je ne veux pas utiliser de package==0.5.9
ligne statique dans mon fichier d'exigences.
Y'a-t'il un quelconque moyen d'y arriver?
la source
"package>=0.2,<=0.3"
n'a pas beaucoup de sens: quand seriez-vous d'accord avec les versions 0.2 et 0.3.0, mais pas avec les versions de correction de bogues de 0.3? Je pense que"package>=0.2,<0.3"
c'est un bien meilleur exemple, car il reflète le cas commun de dire: "veuillez me donner la dernière version de correction de bogue de la version mineure actuelle, mais ne me mettez pas automatiquement à niveau vers la prochaine version mineure, parce que j'aimerais faire cela explicitement, en veillant à ce qu'il n'y ait aucun changement fonctionnel qui m'affecte. "~=0.2
est (à mon humble avis) une meilleure solution que cela.~=0.2.1
cela ferait, par exemple. Être explicite comme dans>=0.2,<0.3
est une bonne chose car c'est vraiment clair ce qui se passe.~=0.2.1
dans un fichier d'exigences. C'est une erreur utilisateur, pas un inconvénient du~=
préfixe.vous pouvez aussi utiliser:
qui est plus cohérent et plus facile à lire.
la source
requirements.txt
OMI. Utiliserpackage==1.*
au lieu depackage>=1.2
empêche pip d'installer la version majeure 2+ pour le package, ce qui est souhaitable car les changements de version majeurs sont souvent incompatibles en amont.Une méthode élégante serait d'utiliser l'
~=
opérateur de libération compatible selon PEP 440 . Dans votre cas, cela équivaudrait à:Par exemple, si les versions suivantes existent, il choisirait
0.5.9
:0.5.0
0.5.9
0.6.0
Pour plus de précision, chaque paire est équivalente:
la source
2.2
avenir planifié2.2.1
, cela~=2.2.*
correspondra même2.2
s'il n'y a pas de numéro tertiaire?~=2.2.0
dans ce cas (l'*
opérateur ne fonctionnera pas si vous utilisez~=
).2.2
et2.2.0
(et2.2.0.0
, et ainsi de suite) sont gérés en interne comme la même chose lorsqu'il s'agit d'installer des packages.~=1.2.3
. Il est beaucoup plus explicite et plus clair d'utiliser à la place le formulaire multi-clauses.== 1.*
n'acceptera pas correctement la v1.1.0. L' opérateur~=
(ou>=
plus<
si vous trouvez cela difficile à lire) est meilleur car il encourage à être correctement spécifique.== 1.*
, échouerait et ne ferait rien si nous avions besoin d'une fonctionnalité de version 1.2 mais que l'utilisateur avait déjà installé 1.1. Votre proposition~= 1.2
équivaut à dire>= 1.2, < 2.0
(ou>= 1.2, == 1.*
). Donc oui, vous avez raison,~=
c'est le meilleur opérateur car il vous permet de cibler la version de développement que vous avez utilisée d'une bibliothèque, tout en autorisant des versions plus récentes dans la même version principale. Merci pour cette clarification!