2012-07-13 22 views

Respuesta

30

De acuerdo con the documentation, su sintaxis debería funcionar correctamente. La documentación indica que:

setuptoolspkg_resources y utilizan una sintaxis común para especificar las dependencias requeridas de un proyecto. Esta sintaxis consiste en el nombre de PyPI de un proyecto, seguido opcionalmente por una lista de "extras" separados por comas entre corchetes, seguido opcionalmente por una lista de especificadores de versiones separados por comas. Un especificador de versión es uno de los operadores <,>, < =,> =, == o! =, Seguido de un identificador de versión.

La documentación da un ejemplo sencillo como esto:

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 

de ampliar que, si desea que su paquete requiere una versión de docutils mayor que la versión 0.3 pero menos de la versión 0.5, código como esto funcionaría:

docutils >= 0.3, <=0.5 

Dos notas adicionales.

  1. La documentación también establece que las especificaciones de dependencia redundantes/superpuestos se combinan internamente, por lo docutils >= 0.3, >=0.2 se combinarían en docutils >= 0.3.
  2. Además, tenga cuidado con la especificación de números de versión conflictivos, que "is meaningless and may therefore produce bizarre results." Por ejemplo, no sé por qué lo haría, pero no use esto: docutils >= 0.3, <=0.2 ya que esto es imposible.
+2

Gran respuesta, pero lo que me confunde es que la coma a veces significa ** o ** y a veces ** y **: la lista de especificaciones de la versión exacta dice claramente '1.1 o 1.2 o ...' y combina '> = 0.3 ,> = 0.2' a simplemente '> = 0.2' solo tiene sentido de esa manera. Pero '> = 0.3, <= 0.5' o su párrafo sobre especificación de versión contradictoria necesita la coma para indicar ** y **. – zpea

+0

para construir sobre la pregunta de @zpea: ¿hay alguna forma de definir múltiples rangos de versiones? por ejemplo '(> = 1.0 AND <2) OR (> = 2.7 AND <2.9) OR (> = 4)' – stefanfoulis

+0

Los documentos dicen que> 1,> 2 se convierten en> 1, pero tendría más sentido convertirse en> 2, como dijiste. Alguien sabe por qué? –

13

Tenga cuidado con las pruebas beta involuntarias. A veces, los mantenedores de paquetes lanzan versiones incompatibles, incompletas o rotas a, b y c para audiencias generales sin previo aviso. La próxima vez que ejecute setup.py en una nueva versión, puede desplegar uno de estos huevos envenenados, y de repente su programa se romperá.

Para mitigar este riesgo, no utilice la declaración de estilo foo >=0.3, <0.4, que tiene un límite superior puramente numérico. <0.4 aún admite versiones 0.4a0, 0.4a1, 0.4b0, 0.4c3, etc. En su lugar, use un límite superior como <0.4a0, como en foo >=0.3, <0.4a0, cuando escriba install_requires.

Cuando setuptools hace algo inesperado, tratando usando verlib para modelar sus comparaciones de versión. Verlib es una buena opción siempre que sus versiones estén normalizadas y no sean contradictorias. Aquí hay un ejemplo que demuestra el orden potencialmente contra-intuitivo de las versiones normalizadas:

#!/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." 
+1

¿Cómo se usa verlib en su archivo setup.py ('install_requires')? –

Cuestiones relacionadas