Me pregunto si hay alguna forma de decirle a pip, específicamente en un archivo de requisitos, que instale un paquete con una versión mínima ( pip install package>=0.2
) y una versión máxima que nunca debe instalarse (api teórica:) pip install package<0.3
.
Pregunto porque estoy usando una biblioteca de terceros que está en desarrollo activo. Me gustaría que mi archivo de requisitos de pip especifique que siempre debe instalar la versión menor más reciente de la rama 0.5.x, pero no quiero que pip intente instalar ninguna versión principal más nueva (como 0.6.x) desde La API es diferente. Esto es importante porque aunque la rama 0.6.x está disponible, los desarrolladores todavía están lanzando parches y correcciones de errores a la rama 0.5.x, por lo que no quiero usar una package==0.5.9
línea estática en mi archivo de requisitos.
¿Hay alguna manera de hacerlo?
fuente
"package>=0.2,<=0.3"
que no tiene mucho sentido: ¿cuándo estarías de acuerdo con 0.2 y 0.3.0, pero no con ninguno de los lanzamientos de corrección de errores de 0.3? Creo que"package>=0.2,<0.3"
es un ejemplo mucho mejor, porque refleja el caso común de decir: "por favor, denme la última versión de corrección de errores de la versión menor actual, pero no me actualicen automáticamente a la próxima versión menor, porque me gustaría hacerlo explícitamente, asegurándome de que no haya cambios funcionales que me afecten ".~=0.2
es (en mi humilde opinión) una mejor solución que esta.~=0.2.1
haría, por ejemplo. Ser explícito como en>=0.2,<0.3
es bueno porque está muy claro lo que está sucediendo.~=0.2.1
en un archivo de requisitos. Ese es un error del usuario, no una desventaja del~=
prefijo.también puedes usar:
que es más consistente y fácil de leer.
fuente
requirements.txt
IMO. El uso enpackage==1.*
lugar depackage>=1.2
evita que pip instale la versión principal 2+ para el paquete, lo cual es deseable ya que los cambios importantes de la versión a menudo son incompatibles con versiones anteriores.Un método elegante sería utilizar el
~=
operador de liberación compatible de acuerdo con PEP 440 . En su caso, esto equivaldría a:Como ejemplo, si existen las siguientes versiones, elegiría
0.5.9
:0.5.0
0.5.9
0.6.0
Para aclarar, cada par es equivalente:
fuente
2.2
futuro planificado2.2.1
, ¿~=2.2.*
coincidirá a2.2
pesar de que no haya un número terciario?~=2.2.0
en ese caso (el*
operador no funcionará si está usando~=
).2.2
y2.2.0
(y2.2.0.0
, etc.) se manejan internamente como lo mismo cuando se trata de instalar paquetes.~=1.2.3
. Es mucho más explícito y más claro usar el formulario de múltiples cláusulas en su lugar.== 1.*
aceptará incorrectamente v1.1.0. El operador~=
(o>=
más<
si le resulta difícil de leer) es mejor porque alienta a ser correctamente específico.== 1.*
lo tanto , fallaría y no haría nada si necesitamos una función de versión 1.2 pero el usuario ya tenía instalado 1.1. Su propuesta~= 1.2
es lo mismo que decir>= 1.2, < 2.0
(o>= 1.2, == 1.*
). Entonces sí, tiene razón,~=
es el mejor operador, ya que le permite orientar la versión de desarrollo que utilizó de una biblioteca, al tiempo que permite versiones más nuevas dentro de la misma versión principal. Gracias por esa aclaración!