web-dev-qa-db-fra.com

Comment spécifier les plages de versions dans install_requires (setuptools, distribuer)

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?

46
minhee

Selon la documentation , votre syntaxe devrait fonctionner correctement. La documentation indique que:

setuptools et pkg_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.

  1. La documentation indique également que les spécifications de dépendance redondantes/qui se chevauchent seront combinées en interne, donc docutils >= 0.3, >=0.2 serait combiné en docutils >= 0.3.
  2. Aussi, soyez prudent lorsque vous spécifiez des numéros de version en conflit, ce qui "n'a pas de sens et peut donc produire des résultats bizarres." Par exemple, je ne sais pas pourquoi, mais n'utilisez pas ceci: docutils >= 0.3, <=0.2 puisque c'est impossible.
40
Ricardo Altamirano

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."
15
Mike B

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. *

2
Stefan Papp

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.

0
RayLuo