В чем разница между ~> и> = при указании rubygem в Gemfile?

120

Я часто вижу в Gemfile следующие обозначения (~>).

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

Я знаю, что знак (> =) просто больше или равен, но что означает обозначение (~>)? Они оба одинаковые или имеют какое-то существенное различие?

самоучка
источник
6
См. Также: Значение ~>требования к версии .
Jörg W Mittag
28
~>иногда называют «оператором спермы».
Эндрю Гримм
3
Можете ли вы указать диапазон для версии Ruby в своем Gemfile? Egruby "~>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. Верхней границы нет.

eldarerathis
источник
Как это происходит с драгоценными камнями, которые используют четыре цифры для управления версиями, такими как backbone-on-rails ?
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. Это правильно?
Wei
Когда я вижу проект GitHub, в котором говорится, что он требует ruby> = 2.4.4, могу ли я предположить, что они поддерживают все рубины после 2.4.4, включая 2.5.1 и даже Ruby 3? Или мы должны действовать осторожно (т.е. вместо того, чтобы думать, что они будут поддерживать все рубины после 2.4.4 включительно, я должен думать, что они имеют в виду, что они не будут поддерживать рубин до 2.4.4)?
Генри Ян
3

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

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

Если вы мало разбираетесь в разработке драгоценных камней или только начинаете заниматься этим, вот несколько хороших ссылок:

  1. Учебное пособие, которое научит вас, как создать свой собственный RubyGem, стандартным методам, связанным с ним, и как загрузить его, чтобы другие могли его установить.
  2. Как создать самоцвет с нуля с помощью Bundler
strangeloops
источник
1
Первое звено - 404
Петр Газаров