在 Gemfile 中指定 ruby​​gem 时 ~> 和 >= 有啥区别?

Posted

技术标签:

【中文标题】在 Gemfile 中指定 ruby​​gem 时 ~> 和 >= 有啥区别?【英文标题】:What is the difference between ~> and >= when specifying rubygem in Gemfile?在 Gemfile 中指定 ruby​​gem 时 ~> 和 >= 有什么区别? 【发布时间】: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 中指定 ruby​​gem 时 ~> 和 >= 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的 Gemfile 中指定本地 gem?

如何在我的 Gemfile 中指定本地 .gem 文件?

ruby 在Gemfile.lock中指定git分支

Gemfile 中的 Ruby Bundler 多个源

bundler 在哪里存储宝石?

找不到 Gemfile