为什么Gemfile语义版本控制运算符(〜>)会产生一个数字不一致的结果?

gemspec语义版本操作符〜(又名twiddle-wakka ,又名悲观操作符)允许对gem版本进行约束,但允许进行一些升级。

我经常看到它可以被解读为:

"~> 3.1" => "Any version 3.x, but at least 3.1" "~> 3.1.1" => "Any version 3.1.x, but at least 3.1.1" 

但是有一个数字,这条规则就会破裂:

  "~> 3" => "Any version x, but at least 3" *NOT TRUE!* "~> 3" => "Any version 3.x" *True. But why?* 

如果我想要“任何版本3.x”,我可以使用“〜> 3.0”,这是一致的。 就目前而言,一个数字的这种操作变化是不一致的,没有记录。

此外,如果我想说“任何高于或等于3的版本”(所以3.x,4.x等……)我很想使用“> =”运算符,我们被告知这是邪恶的 。

这种行为有原因吗?

编辑:

我将这个给大卫找到rubygems中的罪魁祸首文件。 有一个“function”无声地将“3”扩展为“3.0”( 版本中的第148行.rb :“单个数字版本会自动扩展为零以产生合理的结果。”)

我必须说我不同意结果是明智的,因为它打破了预期的顺序,并且阻止能够用该运算符说“任何版本x,但至少3”。 因此,我们被迫进入> =哪个guides.rubygems.org 警告我们不要使用 。 无论如何。 也许这篇文章将作为我一直在寻找的文档……

通过窥视rubygems源(特别是requirement.rb,version.rb),悲观运算符至少需要两个版本控制段。

它也有意义。 因为~> vr只是不平等的语法糖

vr <= current_version.current_release < (v+1).0

如果只有一个版本号,那么上限是多少? 是的,∞(无穷大),所以没有必要为什么它应该工作。 你可以简单地把它写成>= v