在 Gemfile 中指定 rubygem 时 ~> 和 >= 有啥区别?
Posted
技术标签:
【中文标题】在 Gemfile 中指定 rubygem 时 ~> 和 >= 有啥区别?【英文标题】:What is the difference between ~> and >= when specifying rubygem in Gemfile?在 Gemfile 中指定 rubygem 时 ~> 和 >= 有什么区别? 【发布时间】:2011-05-16 15:03:43 【问题描述】:我经常在 Gemfile 中看到以下符号(~>)。
gem "cucumber", "~>0.8.5"
gem "rspec", "~>1.3.0"
我知道符号 (>=) 只是大于或等于,但是 (~>) 符号是什么意思? 它们是否相同或有任何显着差异?
【问题讨论】:
另见:Meaning of~>
in version requirement。
你能在 Gemfile 中指定 Ruby 版本的范围吗?例如。 ruby "~>2.0"
或叫twiddle-wakka
@Dennis 这里是您问题的答案:***.com/a/23116552/6359753
【参考方案1】:
那是pessimistic version constraint。 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:应该是基本一样的行为。四位中的最后一位可以无限制地递增,但第三位不能(因此~>0.9.2.3
将允许 v0.9.2.4 或 v0.9.2.23 但不允许 v0.9.3.0)。如果您只在约束中指定了 3 位数字,那么第四个数字基本上是无关紧要的 - 它只会根据您指定的前三个数字进行约束(例如,~>0.9.2
将接受 0.9.xy 系列中的任何内容,无论 @987654330 是什么@ 是;约束是 9 不能递增)。
“RubyGems 将增加版本中的最后一个数字”的规则有一个例外:当您提供一个数字时。您可能认为“~> 4”表示“任何版本 4 或更高版本”,但it doesn't,所以要小心。
~>0.1 与 ~>0.1.0 怎么样?如果我们将其视为“您可以将最后一位数字增加到某个任意值”,~>0.1 转换为 >=0.1.0 0.1.0 转换为 >=0.1.0
当我看到一个 GitHub 项目说它需要 ruby >= 2.4.4 时,我可以假设他们支持 2.4.4 之后的所有 ruby,包括 2.5.1 甚至 ruby 3?还是我们应该谨慎行事(即,与其认为他们会支持 2.4.4 之后的所有 ruby,我应该认为他们的意思是他们不会支持 2.4.4 之前的任何 ruby)?【参考方案2】:
@millisami 你甚至可以使用这样的悲观约束来添加 gemspec 的依赖项:
gem.add_runtime_dependency "thor", "~> 0.18.1"
如果您对 gem 开发知之甚少或刚刚涉足,以下是一些很好的参考资料:
-
Tutorial that teaches you how to make your own RubyGem, the standard practices associated with it, and how to upload it so that others can install it.
How to create a Gem from scratch with Bundler
【讨论】:
第一个链接是404以上是关于在 Gemfile 中指定 rubygem 时 ~> 和 >= 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章