Je veux faire un package pour dépendre de la plage de version particulière, par exemple >= 0.5.0, < 0.7.0
. Est-il possible dans install_requires
option, et si oui, comment cela devrait-il être?
Selon la documentation , votre syntaxe devrait fonctionner correctement. La documentation indique que:
setuptools
etpkg_resources
utilise une syntaxe commune pour spécifier les dépendances requises d'un projet. Cette syntaxe se compose du nom PyPI d'un projet, éventuellement suivi d'une liste séparée par des virgules de "extras" entre crochets, éventuellement suivie d'une liste séparée par des virgules de spécificateurs de version. Un spécificateur de version est l'un des opérateurs <,>, <=,> =, == ou! =, Suivi d'un identifiant de version.
La documentation donne un exemple simple comme celui-ci:
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
Pour développer cela, si vous souhaitez que votre package nécessite une version de docutils
supérieure à la version 0.3 mais inférieure à la version 0.5, un code comme celui-ci fonctionnerait:
docutils >= 0.3, <=0.5
Deux notes supplémentaires.
docutils >= 0.3, >=0.2
serait combiné en docutils >= 0.3
.docutils >= 0.3, <=0.2
puisque c'est impossible.Méfiez-vous des tests bêta involontaires. Les responsables de packages publient parfois sans préavis des versions incompatibles, incomplètes ou cassées a, b et c auprès du grand public. La prochaine fois que vous courrez setup.py dans un nouveau virtualenv, vous pourriez abattre l'un de ces œufs empoisonnés, et soudainement votre programme se cassera.
Pour atténuer ce risque, ne pas utiliser les foo >=0.3, <0.4
déclaration de style, qui a une limite supérieure purement numérique. <0.4
admet toujours les versions 0.4a0, 0.4a1, 0.4b0, 0.4c3, etc. Utilisez plutôt une borne supérieure comme <0.4a0
, un péché foo >=0.3, <0.4a0
, lorsque vous écrivez votre install_requires.
Quand setuptools fait quelque chose d'inattendu, en essayant d'utiliser verlib pour modéliser vos comparaisons de versions. Verlib est un assez bon ajustement tant que vos versions sont normalisées et non contradictoires. Voici un exemple qui illustre l'ordre potentiellement contre-intuitif des versions normalisées:
#!/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."
Un autre moyen consiste à utiliser des caractères génériques.
Cela ne s'applique pas à> = 0.5.0, <0.7.0, mais si vous décidez que toutes les versions de maintenance doivent être prises en charge (par exemple, 0.5.0 à 0.5.x), vous pouvez utiliser
== 0,5. *
par exemple. docutils == 0,3. *
La notation mentionnée dans la question d'OP, >= 0.5.0, < 0.7.0
, fonctionne déjà.
Et, puisque la plupart (sinon la plupart) des bibliothèques utiliseraient déjà versioning sémantique , donc par définition, vous pouvez définir votre dépendance comme A>=1,<2
, comme expliqué ici . Et ils ont même implémenté ne syntaxe encore plus simple pour cela, A~=X.Y
, ce qui signifie qu'il nécessite au moins la version X.Y, mais autorise également toute version ultérieure avec une version MAJEUR correspondante.