Gemfile'da rubygem belirtirken ~> ve> = arasındaki fark nedir?


120

Gemfile'da sıklıkla aşağıdaki gösterimi (~>) görüyorum.

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

(> =) İşaretinin sadece büyük veya eşit olduğunu biliyorum, ancak (~>) gösterimi ne anlama geliyor? İkisi de aynı mı yoksa önemli bir farkı var mı?



28
~>bazen "spermi operatör" olarak adlandırılır.
Andrew Grimm

3
Gemfile'ınızda Ruby sürümü için bir aralık belirleyebilir misiniz? Örneğinruby "~>2.0"
Dennis

1
veya
twiddle

@Dennis burada sorunuzun cevabı: stackoverflow.com/a/23116552/6359753
Henry Yang

Yanıtlar:


165

Bu kötümser bir versiyon kısıtlaması . RubyGems, sağlanan sürümün son basamağını artıracak ve maksimum sürüme ulaşana kadar bunu kullanacaktır. Öyleyse ~>0.8.5anlamsal olarak eşdeğerdir:

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

Bunu düşünmenin kolay yolu, son rakamın keyfi bir değere yükselmesi konusunda sorun yaşamamanızdır, ancak dizede ondan öncekiler sağladığınızdan daha büyük olamaz. Bu nedenle ~>0.8.5, herhangi bir değer üçüncü basamak (5) için 5'ten büyük veya ona eşit olması koşuluyla kabul edilebilir, ancak baştaki 0,8 "0,8" olmalıdır.

Örneğin, 0.9 sürümünün bazı önemli değişiklikleri uygulayacağını düşünüyorsanız, ancak 0.8.x sürüm serisinin tamamının sadece hata düzeltmeleri olduğunu biliyorsunuz.

Ancak, basitçe kullanılması ">=0.8.5", 0.8.5'ten sonraki (veya buna eşit) herhangi bir sürümün kabul edilebilir olduğunu gösterir. Üst sınır yok.


Bu , ray üstü omurga gibi versiyonlama için dört basamak kullanan mücevherlerle nasıl davranır ?
JJD

2
@JJD: Temelde aynı davranış olmalı. ~>0.9.2.3Dördün son rakamı sınırsız artırılabilir, ancak üçüncüsü olmaz (bu nedenle v0.9.2.4 veya v0.9.2.23'e izin verir, ancak v0.9.3.0'a izin vermez). Kısıtlamada yalnızca 3 basamak belirttiyseniz, dördüncü esas olarak alakasız olacaktır - yalnızca belirttiğiniz ilk üçe göre kısıtlanır (örneğin ~>0.9.2, bir 0.9.xy serisi içindeki her şeyi kabul eder, ne olursa olsun y; kısıtlama 9'un artırılamayacağını).
eldarerathis

3
Yine de "RubyGems sürümdeki son basamağı artıracak" kuralının bir istisnası vardır: bir basamak sağladığınızda. "~> 4" ün "Herhangi bir sürüm 4 veya üzeri" anlamına gelmesini bekleyebilirsiniz, ancak bu değildir , bu yüzden dikkatli olun.
hlascelles

2
Peki ya ~> 0.1 ve ~> 0.1.0? Bunu "keyfi bir değere yükselen son basamakta sorun yok" olarak düşünürsek, ~> 0.1> = 0.1.0 <1.0.0, ~> 0.1.0 ise> = 0.1.0 < 0.2.0. Bu doğru mu?
Wei

Ruby> = 2.4.4 gerektirdiğini söyleyen bir GitHub projesi gördüğümde, 2.5.1 dahil 2.4.4'ten sonra ve hatta Ruby 3'ü desteklediklerini varsayabilir miyim? Yoksa güvenli oynamalı mıyız (yani 2.4.4'ten sonra tüm yakutları destekleyeceklerini düşünmek yerine, 2.4.4'ten önce hiçbir yakutu desteklemeyeceklerini düşünmeliyim)?
Henry Yang

3

@millisami Aşağıdaki gibi kötümser kısıtlamayı kullanarak gemspec ile bağımlılıklar eklemek için bile kullanabilirsiniz:

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

Gem geliştirme hakkında fazla bir şey bilmiyorsanız veya yeni başlıyorsanız, bunlar bazı iyi referanslardır:

  1. Size kendi RubyGem'inizi nasıl yapacağınızı, onunla ilişkili standart uygulamaları ve başkalarının kurabilmesi için onu nasıl yükleyeceğinizi öğreten eğitim.
  2. Bundler ile sıfırdan bir Mücevher nasıl oluşturulur

1
İlk bağlantı 404
Petr Gazarov
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.