Яка різниця між ~> і> = при вказівці rubygem у Gemfile?


120

Я часто бачу такі позначення (~>) у Gemfile.

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

Я знаю, що знак (> =) просто більший або дорівнює, але що означає (~>) позначення? Вони обидва однакові чи має якусь суттєву різницю?



28
~>іноді називають "оператором сперми".
Ендрю Грімм

3
Чи можете ви вказати діапазон для версії Ruby у своєму Gemfile? Напр.ruby "~>2.0"
Денніс

1
або називається twiddle-wakka
SuckerForMayhem

@Dennis ось відповідь на ваше запитання: stackoverflow.com/a/23116552/6359753
Генрі Ян

Відповіді:


165

Це песимістичне обмеження версії . RubyGems збільшуватиме останню цифру у наданій версії та використовуватиме її до тих пір, поки не досягне максимальної версії. Так ~>0.8.5семантично еквівалентно:

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

Найпростіший спосіб подумати над тим, що ви добре з останньою цифрою, що збільшується до якогось довільного значення, але ті, що передують йому в рядку, не можуть бути більшими, ніж ви вказали. Таким чином ~>0.8.5, для третього розряду (5) будь-яке значення є прийнятним за умови, що воно більше або дорівнює 5, але провідне значення 0,8 повинно бути "0,8".

Ви можете зробити це, наприклад, якщо ви думаєте, що версія 0.9 внесе деякі зміни, але ви знаєте, що вся версія версії 0.8.x - це лише виправлення.

Однак просто використання ">=0.8.5"означало б, що будь-яка версія пізніше (або дорівнює) 0,8,5 є прийнятною. Верхньої межі немає.


Як це поводиться з дорогоцінними каменями, які використовують чотири цифри для своєї версії, наприклад, магістраль на рейки ?
JJD

2
@JJD: В основному це має бути однакова поведінка. Останню цифру з чотирьох можна збільшувати без зв'язаних, але третю не буде (так ~>0.9.2.3би було передбачено v0.9.2.4 або v0.9.2.23, але не v0.9.3.0). Якщо ви вказали лише 3 цифри в обмеженні, то четверта була б по суті нерелевантною - вона ~>0.9.2обмежилася б лише на основі перших трьох вказаних вами (наприклад , прийняла б що-небудь у серії 0.9.xy, незалежно від того, що yє; обмеження - це що 9 не можна збільшувати).
eldarerathis

3
Існує виняток із правила, що "RubyGems збільшить останню цифру у версії", хоча: ви надаєте одну цифру. Ви можете очікувати, що "~> 4" буде означати "Будь-яка версія 4 або вище", але це не так, тому будьте обережні.
hlascelles

2
Що про ~> 0,1 проти ~> 0,1,0? Якщо ми думаємо про це як "ти добре, коли остання цифра збільшується до деякого довільного значення", ~> 0,1 перекладається на> = 0,1,0 <1,0,0, тоді як ~> 0,1,0 означає> = 0,1,0 < 0,2,0. Це правильно?
Вей

Коли я бачу, що проект GitHub говорить, що він вимагає рубіну> = 2.4.4, чи можу я припустити, що вони підтримують усі рубіни після 2.4.4, включаючи 2.5.1 і навіть рубін 3? Або ми повинні грати в безпеку (тобто замість того, щоб думати, що вони підтримуватимуть усі рубіни після 2.4.4 включно, я повинен думати, що вони означають, що вони не підтримуватимуть жодного рубіну до 2.4.4)?
Генрі Ян

3

@millisami Ви навіть можете використовувати для додавання залежностей з gemspec, використовуючи песимістичне обмеження, як це:

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

Якщо ви не знаєте багато про розробку дорогоцінних каменів або просто впадаєте в нього, це кілька хороших посилань:

  1. Підручник, який навчає, як зробити свій власний RubyGem, стандартні практики, пов’язані з ним, і як його завантажити, щоб інші могли його встановити.
  2. Як створити Gem з нуля за допомогою Bundler

1
Перше посилання - 404
Петро Газаров
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.