Gostaria de saber se há alguma maneira de dizer ao pip, especificamente em um arquivo de requisitos, para instalar um pacote com uma versão mínima ( pip install package>=0.2
) e uma versão máxima que nunca deve ser instalada (API teórica:) pip install package<0.3
.
Eu pergunto porque estou usando uma biblioteca de terceiros que está em desenvolvimento ativo. Gostaria que meu arquivo de requisitos de pip especifique que ele deve sempre instalar a versão menor mais recente da ramificação 0.5.x, mas não quero que o pip tente instalar quaisquer versões principais mais recentes (como 0.6.x) desde a API é diferente. Isso é importante porque, embora o ramo 0.6.x esteja disponível, os desenvolvedores ainda estão lançando patches e correções no ramo 0.5.x, portanto, não quero usar uma package==0.5.9
linha estática no meu arquivo de requisitos.
Existe alguma maneira de fazer isso?
fonte
"package>=0.2,<=0.3"
que não faz muito sentido: quando você ficaria bem com o 0.2 e o 0.3.0, mas não com os lançamentos de correções do 0.3? Eu acho que"package>=0.2,<0.3"
é um exemplo muito melhor, porque reflete o caso comum de dizer: "por favor, me dê a última versão de correção de bug da versão menor atual, mas não me atualize automaticamente para a próxima versão menor, porque eu gostaria de fazer isso explicitamente, certificando-se de que não haja alterações funcionais que me afetem ".~=0.2
é (imho) uma solução melhor que essa.~=0.2.1
que faria, por exemplo. Ser explícito como em>=0.2,<0.3
é uma coisa boa, porque é realmente claro o que está acontecendo.~=0.2.1
em um arquivo de requisitos. Isso é erro do usuário, não uma desvantagem do~=
prefixo.você também pode usar:
que é mais consistente e fácil de ler.
fonte
requirements.txt
IMO. O uso empackage==1.*
vez depackage>=1.2
impedir o pip de instalar a versão principal 2+ para o pacote, o que é desejável, pois as principais alterações na versão geralmente são incompatíveis com versões anteriores.Um método elegante seria usar o
~=
operador de liberação compatível de acordo com a PEP 440 . No seu caso, isso equivaleria a:Como exemplo, se as seguintes versões existirem, ele escolheria
0.5.9
:0.5.0
0.5.9
0.6.0
Para esclarecimento, cada par é equivalente:
fonte
2.2
futuro e um planejado2.2.1
, será~=2.2.*
compatível,2.2
apesar de não haver um número terciário?~=2.2.0
nesse caso (o*
operador não funcionará se você estiver usando~=
).2.2
e2.2.0
(e2.2.0.0
assim por diante) são tratados internamente como a mesma coisa quando se trata de instalar pacotes.~=1.2.3
. É muito mais explícito e claro usar o formulário com várias cláusulas.== 1.*
aceitará incorretamente a v1.1.0. O operador~=
(ou>=
mais,<
se você acha difícil ler) é melhor porque incentiva a ser corretamente específico.== 1.*
, falharia e não faria nada se precisarmos de um recurso da versão 1.2, mas o usuário já tivesse o 1.1 instalado. Sua proposta~= 1.2
é o mesmo que dizer>= 1.2, < 2.0
(ou>= 1.2, == 1.*
). Então, sim, você está certo,~=
é o melhor operador, pois permite direcionar a versão de desenvolvimento que você usou de uma biblioteca, enquanto permite versões mais novas na mesma versão principal. Obrigado por esse esclarecimento!