Qual é a diferença entre ~> e> = ao especificar rubygem no Gemfile?


120

Costumo ver a seguinte notação (~>) no Gemfile.

gem "cucumber", "~>0.8.5"
gem "rspec", "~>1.3.0"

Eu sei que o sinal (> =) é apenas maior ou igual a, mas o que a notação (~>) significa? Ambos são iguais ou têm alguma diferença significativa?



28
~>às vezes é chamado de "operador espermático".
Andrew Grimm

3
Você pode especificar um intervalo para a versão Ruby em seu Gemfile? Exruby "~>2.0"
Dennis


@Dennis aqui está uma resposta à sua pergunta: stackoverflow.com/a/23116552/6359753
Henry Yang

Respostas:


165

Essa é uma restrição de versão pessimista . RubyGems irá incrementar o último dígito na versão fornecida e usá-lo até atingir a versão máxima. Portanto, ~>0.8.5é semanticamente equivalente a:

gem "cucumber", ">=0.8.5", "<0.9.0"

A maneira mais fácil de pensar sobre isso é que você está bem com o último dígito incrementado para algum valor arbitrário, mas os que o precedem na string não podem ser maiores do que o fornecido. Assim ~>0.8.5, para , qualquer valor é aceitável para o terceiro dígito (o 5), desde que seja maior ou igual a 5, mas o 0,8 à esquerda deve ser "0,8".

Você pode fazer isso, por exemplo, se achar que a versão 0.9 vai implementar algumas mudanças importantes, mas sabe que toda a série de lançamentos 0.8.x são apenas correções de bugs.

No entanto, o simples uso ">=0.8.5"indicaria que qualquer versão posterior (ou igual a) 0.8.5 é aceitável. Não há limite superior.


Como isso se comporta com gemas que usam quatro dígitos para suas versões, como backbone-on-rails ?
JJD

2
@JJD: Deve ser basicamente o mesmo comportamento. O último dígito dos quatro pode ser incrementado sem limite, mas o terceiro não (então ~>0.9.2.3permitiria v0.9.2.4 ou v0.9.2.23, mas não v0.9.3.0). Se você especificou apenas 3 dígitos na restrição, o quarto seria essencialmente irrelevante - seria restrito apenas com base nos três primeiros que você especificar (por exemplo ~>0.9.2, aceitaria qualquer coisa dentro de uma série 0.9.xy, independentemente do que yseja; a restrição é que o 9 não pode ser incrementado).
eldarerathis

3
Existe uma exceção à regra de que "RubyGems irá incrementar o último dígito na versão": quando você fornece um dígito. Você pode esperar que "~> 4" signifique "Qualquer versão 4 ou superior", mas não significa , então tome cuidado.
hlascelles

2
E quanto a ~> 0,1 vs. ~> 0,1.0? Se pensarmos nisso como "você está bem com o último dígito incrementando para algum valor arbitrário", ~> 0,1 se traduz em> = 0,1.0 <1.0.0 enquanto ~> 0.1.0 se traduz em> = 0.1.0 < 0.2.0. Isso está correto?
Wei

Quando vejo um projeto GitHub dizendo que requer ruby> = 2.4.4, posso supor que eles suportam todos os ruby ​​após 2.4.4 incluindo 2.5.1 e até mesmo ruby ​​3? Ou devemos jogar pelo seguro (ou seja, ao invés de pensar que eles suportarão todos os rubis após 2.4.4 inclusive, eu deveria pensar que eles significam que eles não suportarão nenhum ruby ​​antes de 2.4.4)?
Henry Yang

3

@millisami Você pode até usar para adicionar dependências com o gemspec usando a restrição pessimista como esta:

gem.add_runtime_dependency "thor", "~> 0.18.1"

Se você não sabe muito sobre o desenvolvimento de gemas ou está apenas começando, estas são algumas boas referências:

  1. Tutorial que ensina como fazer seu próprio RubyGem, as práticas padrão associadas a ele e como fazer o upload para que outras pessoas possam instalá-lo.
  2. Como criar uma gema do zero com Bundler

1
O primeiro link é 404
Petr Gazarov
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.