【问题标题】: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"

我知道符号 (>=) 只是大于或等于,但是 (~>) 符号是什么意思? 它们是否相同或有任何显着差异?

【问题讨论】:

标签: ruby rubygems gemfile


【解决方案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 开发知之甚少或刚刚涉足,以下是一些很好的参考资料:

  1. 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.
  2. How to create a Gem from scratch with Bundler

【讨论】:

  • 第一个链接是404
猜你喜欢
  • 2011-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-21
  • 2011-07-21
  • 1970-01-01
  • 2010-09-06
  • 2010-11-17
相关资源
最近更新 更多