在Gemfile中指定rubygem时,使用“~>”和“>=”有什么区别?

130

我经常在Gemfile中看到以下符号(~>)。

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

我知道符号(>=)表示大于或等于,但是 (~>) 符号是什么意思?它们是否相同或有重大区别?


6
另请参见:~> 在版本要求中的含义 - Jörg W Mittag
3
你能在 Gemfile 文件中指定 Ruby 版本的范围吗?例如:ruby "~>2.0" - Dennis
1
或称twiddle-wakka - mswieboda
@Dennis,这是你问题的答案:https://dev59.com/y37aa4cB1Zd3GeqPusrU#23116552 - Henry Yang
2个回答

179
那是一个悲观的版本约束。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(例如 backbone-on-rails)时会有什么行为表现? - JJD
2
@JJD:基本上行为应该是相同的。四个版本号中的最后一个数字可以无限增加,但第三个版本号不会(因此“>0.9.2.3”将允许v0.9.2.4或v0.9.2.23,但不允许v0.9.3.0)。如果您在约束条件中只指定了三个数字,则第四个数字基本上是无关紧要的 - 它仅根据您指定的前三个数字进行约束(例如,“>0.9.2”将接受0.9.x.y系列中的任何内容,无论“y”是什么;约束是不能将9递增)。 - eldarerathis
3
“RubyGems将增加版本号的最后一位数”这条规则有一个例外,就是当您提供一个数字时。您可能期望“~> 4”表示“任何版本号大于等于4”,但实际上它并不是这样(参见https://dev59.com/04Dba4cB1Zd3GeqPEndY),所以请小心使用。 - 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之后的ruby版本,包括2.5.1甚至ruby 3吗?还是我们应该保险起见(即,不要认为他们将支持所有2.4.4之后的ruby版本,而是应该认为他们不会支持任何2.4.4之前的ruby版本)? - Henry Yang
@Wei,你说得对,可以这样说:~>0.1 等同于 >=0.1.0 <1.0.0,而 ~>0.1.0 则等同于 >=0.1.0 < 0.2.0。如果需要参考,可以查看 https://guides.rubygems.org/patterns/#pessimistic-version-constraint 并搜索“Pessimistic version constraint”。 - Henry Yang

3

1
第一个链接是404。 - Petr Gazarov

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