波浪号大于号(~>)在版本要求中的含义是什么?

115

~> 在 gem 规格中的版本要求意味着什么?

hanna-0.1.12 依赖于 [haml (~> 2.2.8)]

4
或者 twiddle-wakka - mswieboda
3
好的,以下是您需要翻译的内容:+1 @SuckerForMayhem,"twiddle-wakka" 更有趣。新链接:http://guides.rubygems.org/patterns/#pessimistic-version-constraint -- 它本身链接到 https://robots.thoughtbot.com/rubys-pessimistic-operator - Nate Anderson
3
@SuckerForMayhem Twiddle-wakka听起来像某种传奇野兽,就像山羊吸血鬼一样。这是我对话题的贡献。欢迎社会。 - twiz
1
感谢 @TheRedPea 更新的链接。 - mswieboda
4个回答

119
RubyGems手册将其称为悲观版本约束
假设您指定了一个n部分版本号,例如1.3(2部分)或3.5.6.2(4部分)作为约束条件。那么,为了满足约束条件,版本号必须同时满足以下两个条件:
1.版本号的前n-1部分必须与约束的前n-1部分完全相同(例如1.x3.5.6.x匹配,但0.x3.5.7.x不匹配)且
2.版本号的最后一部分必须大于或等于约束的最后一部分(例如1.99993.5.6.2匹配,但1.23.5.6.1不匹配)。
换句话说,
~> x1.x2.x3. … .xn-2.xn-1.xn
匹配
x1.x2.x3. … .xn-2.xn-1.y,其中y >= xn
这被称为“悲观”约束的原因,也是它的用例,是因为当您只说> x.y.z时,您是乐观的:您假设从现在开始,直到永远,API将永远不会改变,这当然是一个相当大胆的假设。但是,大多数项目都有规则,规定何时允许它们破坏向后兼容性,以及当它们确实破坏向后兼容性时如何更改版本号。你可以使用悲观约束来编码这些版本编号规则,因此你可以确信你的代码将始终继续工作(假设另一个项目的作者实际上遵循自己的规则,不幸的是这并不总是情况)。

55
换句话说:~> 表示只允许使用该特定版本及其最后一位小数之后的新子版本。 - Magne

24
换句话说,您可以使用此符号使您的宝石保持最新,并避免进行可能会破坏您的应用程序的主要更新。例如,“~> 1.2”将更新您的宝石到1.3(如果发布了这样的版本),但不会将其更新为2.0。

1
我认为这个答案不完整。重要的是要提到版本号中部分数量的相关性。例如,“~> 1.2.0”将不会更新 gem 到 1.3 版本,而是会更新到 >= 1.2.0 且 < 1.3.0 的版本。 - Martin Carel

18

我认为最好地概括了这一点:

符号"~>"有特殊含义,最好通过示例来说明。 ~> 2.0.3等同于>= 2.0.3且< 2.1。~> 2.1 等同于 >= 2.1且< 3.0。~> 2.2.beta将匹配类似2.2.beta.12的预发行版本。


1
很抱歉,我不知道。我很高兴接受的答案更详细地解释了这个问题。这种基于示例的解释并不能真正帮助我理解运算符的含义。 - tripleee

-1

它匹配具有相同主/次版本号的任何版本。这意味着在这种情况下,haml〜>2.2.8将匹配任何2.2.x版本。

这可用于确保新宝石中的API破坏性更改不会导致依赖于那个已更改的新宝石,从而在这种情况下会破坏hanna。


8
这并不是错误的,但它不完整。了解"> 2.0"和"> 2.0.0"之间的区别非常重要——前者匹配2.0、2.1、2.2.7以及所有低于(但不包括)3.0的版本。后者匹配2.0、2.0.1、2.0.999以及所有低于(但不包括)2.1的版本。 - James A. Rosen
5
@James A. Rosen:此外,“~> 2.2.8”不会与“任何2.2.x”版本匹配,正如该回答所说的那样,它只会匹配x ≥ 8的2.2.x版本。换句话说,该回答最多是更加不完整,接近错误并且绝对具有误导性。 - Jörg W Mittag

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接