Qual é o significado do ~>
requisito de versão nas especificações de gemas?
hanna-0.1.12 depende de [haml (~> 2.2.8)]
Qual é o significado do ~>
requisito de versão nas especificações de gemas?
hanna-0.1.12 depende de [haml (~> 2.2.8)]
Respostas:
O manual do RubyGems chama isso de restrição de versão pessimista .
Suponha que você especificou um número de versão de n partes, por exemplo 1.3
(2 partes) ou
3.5.6.2
(4 partes) como a restrição. Então, a fim de cumprir a restrição, um número de versão deve satisfazer ambas as seguintes condições
As primeiras n-1 partes do número da versão devem ser idênticas às primeiras n-1 partes da restrição (por exemplo, 1.x
ou 3.5.6.x
corresponde, mas 0.x
ou 3.5.7.x
não) e
A última parte do número da versão deve ser maior ou igual à última parte da restrição (por exemplo, 1.9999
e 3.5.6.2
corresponde, mas 1.2
ou 3.5.6.1
não).
Em outras palavras
~> x 1 .x 2 .x 3 . … .X n-2 .x n-1 .x n
partidas
x 1 .x 2 .x 3 . … .X n-2 .x n-1 .y, y> = x n
O motivo pelo qual isso é chamado de restrição "pessimista", e também o caso de uso para isso, é que, quando você apenas diz > x.y.z
, está sendo otimista: você assume que, de agora em diante, por toda a eternidade, a API nunca mudará. É claro que esta é uma suposição bastante ousada. No entanto, a maioria dos projetos têm regras sobre quando eles estão autorizados a
quebrar compatibilidade com versões anteriores , e como eles tem que mudar seu número de versão quando eles fazem compatibilidade com versões anteriores de quebra. Você pode codificar essas regras de numeração de versão usando uma restrição pessimista e, portanto, pode ter certeza de que seu código sempre continuará a funcionar (assumindo que o autor do outro projeto realmente adere às suas próprias regras, o que infelizmente nem sempre é o caso )
Em outras palavras, você pode usar este símbolo para manter sua gema atualizada com todas as pequenas atualizações e evitar fazer uma grande atualização que pode quebrar seu aplicativo.
Por exemplo, "~> 1.2" atualizará sua gem para 1.3 (se tal versão for lançada), mas não atualizará para 2.0
Acho que a documentação do bundler resume isso:
O especificador ~> tem um significado especial, melhor mostrado pelo exemplo. ~> 2.0.3 é idêntico a> = 2.0.3 e <2.1. ~> 2.1 é idêntico a> = 2.1 e <3.0. ~> 2.2.beta corresponderá a versões de pré-lançamento como 2.2.beta.12.
Corresponde a qualquer versão que tenha a mesma parte principal / secundária. Isso significa que, neste caso, haml ~> 2.2.8 corresponderá a qualquer versão 2.2.x.
Isso pode ser usado para garantir que uma alteração de quebra de API em uma nova gema não resulte na dependência daquela gema recém-modificada que quebraria hanna neste caso.
~> 2.0
e ~> 2.0.0
- o primeiro corresponde a 2.0, 2.1, 2.2.7 e tudo o mais até (mas não incluindo) 3.0. Este último corresponde a 2.0, 2.0.1, 2.0.999 e tudo o mais até (mas não incluindo) 2.1.
~> 2.2.8
será não corresponder "qualquer 2.2.x" versão como alega resposta, mas apenas 2.2.x versões com x ≥ 8. IOW: a resposta é na melhor das hipóteses ainda mais incompleta, na fronteira com incorreta e definitivamente enganoso.