在 Gemfile 指定 rubygem 时,~ > 和 > = 有什么区别?

我经常在 Gemfile 看到下面的符号(~ >)。

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

我知道符号(> =)只是大于或等于,但是(~ >)符号是什么意思呢? 它们是一样的还是有明显的区别?

33238 次浏览

这是 悲观版本约束。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是可以接受的。没有上限。

@ millisami 你甚至可以像下面这样使用悲观约束来添加 gemspec 的依赖项:

gem.add_runtime_dependency "thor", "~> 0.18.1"

如果你不太了解 gem 开发,或者只是刚刚开始涉足,下面是一些很好的参考资料:

  1. 教程,教您如何制作自己的 RubyGem,与之相关的标准实践,以及如何上传它,以便其他人可以安装它。
  2. 如何用 Bundler 从头创建一个 Gem