为什么 Gem 在 RubyGem 中提供 ~> AND =>?

Why does a Gem provide ~> AND => in RubyGems?

bcrypt 的 gem https://rubygems.org/gems/bcrypt/versions/3.1.11

显示此用法

gem 'bcrypt', '~> 3.1', '>= 3.1.11'

为什么悲观算子有两个版本?

我们通常只为其他 gems

使用一个版本

'~> 3.1' 表示所需的版本可以是 3.1.x3.2.x3.3.x 或...,但永远不会达到 4.0.

'>= 3.1.11'的意思已经很清楚了

所以放在一起,表示版本可以是3.x.y where x >= 2 or x = 1 and y >= 11.

也许这个表示法更清楚:

gem 'bcrypt', '>= 3.1.11', '< 4'

>= 3.1.11 是一个“乐观”的版本约束。它是说从 3.1.11 开始的所有更改都将起作用,但对于版本 4.0.0 这不是真的。

~> 3.1是“悲观”。这明确排除了可能破坏您的代码的版本。它基本上是说 >= 3.1< 4.0。但是如果你有 ~> 3.1.1,它将等于 >= 3.1.1 但小于 3.2

如果你想允许使用较新的向后兼容版本但需要特定的错误修复,你可以使用复合要求,如 '~> 3.1', '>= 3.1.11' 这在 http://guides.rubygems.org/patterns/#pessimistic-version-constraint If 中有详细说明您希望允许使用较新的向后兼容版本但需要特定的错误修复您可以使用复合要求,例如... '~> 2.2', '>= 2.2.1'