版本要求中tilde-greater-than(〜>)的含义?


92

~>gem规范中的版本要求是什么意思?

hanna-0.1.12取决于[haml(〜> 2.2.8)]

27
有时称为精子运算符。
Andrew Grimm'3


3
+1 @SuckerForMayhem,“ twiddle-wakka”更有趣。新链接:guides.rubygems.org/patterns/#pessimistic-version-constraint-它本身链接到robots.thoughtbot.com/rubys-pessimistic-operator
红豌豆

2
@SuckerForMayhem Twiddle-wakka听起来像某种传奇的野兽,如chupacabra。这是我对该主题的贡献。欢迎社会。
twiz

1
thx以获取更新的链接@TheRedPea
SuckerForMayhem

Answers:


93

RubyGems手册将其称为 悲观版本约束

假设您指定了n个部分的版本号,例如1.3(2个部分)或 3.5.6.2(4个部分)作为约束。然后,为了满足该约束,版本号必须满足以下两个条件

  1. 第一n-1份的版本号必须是等同于第一n-1份约束的(例如1.x3.5.6.x匹配,但0.x或者3.5.7.x没有)

  2. 版本号的最后一部分必须大于或等于约束的最后一部分(例如1.99993.5.6.2比赛,但1.2还是3.5.6.1没有)。

换一种说法

〜> x 1 .x 2 .x 3。….x n-2 .x n-1 .x n

火柴

x 1 .x 2 .x 3。….x n-2 .x n-1 .y,y> = x n

之所以称其为“悲观的”约束,也是因为它的用例,是因为当您只是说时> x.y.z,您就是乐观的:您假设从现在开始直到所有永恒,API永远不会改变。当然,这是一个非常大胆的假设。但是,大多数项目都有关于何时允许其 向后兼容的规则,以及当它们确实具有向后兼容时如何更改版本号的规则。您可以使用悲观约束对这些版本编号规则进行编码,因此可以确保您的代码将始终能够正常工作(假设另一个项目的作者实际上遵守了自己的规则,不幸的是,并非总是如此)。


32
换句话说:〜>表示将只允许该特定版本以及较新的子版本在最后的十进制中。
Magne 2014年

18

换句话说,您可以使用此符号来使您的gem保持所有次要更新,并避免进行可能破坏您应用程序的主要更新。

例如,“〜> 1.2”会将您的gem更新为1.3(如果已发布该版本),但不会将其更新为2.0


13

我认为捆绑器文档最好总结一下:

说明符〜>具有特殊含义,以示例最好地显示出来。〜> 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中断新宝石的更改不会导致依赖于新的但已更改的宝石,在这种情况下,这会破坏汉娜。


7
这不是不正确的,但是不完整。重要的是要了解~> 2.0和之间的区别~> 2.0.0-前者匹配2.0、2.1、2.2.7,以及其他所有(但不包括)3.0。后者与2.0、2.0.1、2.0.999以及其他所有内容(不包括2.1)匹配。
詹姆斯·A·罗森

5
@James A. Rosen:同样,答案声称~> 2.2.8不会匹配“任何2.2.x”版本,而x≥8的将仅匹配2.2.x版本。误导。
约尔格W¯¯米塔格
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.