在Gemfile中指定rubygem时,〜>和> =有什么区别?


120

我经常在Gemfile中看到以下表示法(〜>)。

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

我知道符号(> =)等于或大于,但是(〜>)表示什么意思?他们都是一样的还是有明显的不同?



28
~>有时被称为“精子运营商”。
安德鲁·格林

3
您可以在Gemfile中指定Ruby版本的范围吗?例如ruby "~>2.0"
丹尼斯


@丹尼斯(Dennis)是对您问题的答案:stackoverflow.com/a/23116552/6359753
亨利·杨

Answers:


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的版本都是可接受的。没有上限。


对于使用四位数字进行版本控制的gem(例如rails-on-rails),它的表现如何?
JJD 2012年

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 2012年

3
但是,“ RubyGems将递增版本中的最后一位”是一个例外:当您提供一位时。您可能希望“〜> 4”表示“任何版本4或更高版本”,但是不是,所以要小心。
hlascelles 2014年

2
〜> 0.1 vs.〜> 0.1.0怎么办?如果我们将其视为“您可以将最后一位数字递增到任意值,就可以了”,那么〜> 0.1表示> = 0.1.0 <1.0.0,而〜> 0.1.0表示> = 0.1.0 < 0.2.0。那是对的吗?
2014年

当我看到一个GitHub项目说它需要ruby> = 2.4.4时,我可以假定它们支持2.4.4之后的所有ruby,包括2.5.1甚至是ruby 3吗?还是我们应该谨慎行事(即不要以为他们将在2.4.4之后(包括24.4)支持所有红宝石,而应该认为它们意味着在2.4.4之前将不支持任何红宝石)?
亨利·杨

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.