Significado de til-maior-que (~>) no requisito de versão?

92

Qual é o significado do ~>requisito de versão nas especificações de gemas?

hanna-0.1.12 depende de [haml (~> 2.2.8)]
Alexey Chernikov
fonte
27
Às vezes é chamado de operador de esperma.
Andrew Grimm,
4
ou twiddle-wakka
SuckerForMayhem
3
+1 @SuckerForMayhem, "twiddle-wakka" é mais engraçado. Novo link: Guides.rubygems.org/patterns/#pessimistic-version-constraint - que por si só leva a robots.thoughtbot.com/rubys-pessimistic-operator
The Red Pea
2
@SuckerForMayhem Twiddle-wakka soa como algum tipo de besta lendária como o chupacabra. Esta tem sido minha contribuição para o tema. Você é bem-vinda sociedade.
twiz
1
thx para links atualizados @TheRedPea
SuckerForMayhem

Respostas:

93

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

  1. 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.xou 3.5.6.xcorresponde, mas 0.xou 3.5.7.xnão) e

  2. A última parte do número da versão deve ser maior ou igual à última parte da restrição (por exemplo, 1.9999e 3.5.6.2corresponde, mas 1.2ou 3.5.6.1nã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 )

Jörg W Mittag
fonte
32
Em outras palavras: ~> significa que permitirá apenas aquela versão específica e sub-versões mais recentes no último decimal.
Magne
18

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

Redjam
fonte
13

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.

Ari
fonte
1
Receio que não. Estou feliz que a resposta aceita explica isso com mais detalhes. Esta explicação baseada em exemplo realmente não me ajuda a entender o que o operador significa.
tripleee
-1

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.

Dirkjan Bussink
fonte
7
Isso não é incorreto, mas está incompleto. É importante entender a diferença entre ~> 2.0e ~> 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.
James A. Rosen
5
@ James A. Rosen: Além disso, ~> 2.2.8será 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.
Jörg W Mittag