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

标签 ruby rubygems versioning gemfile

gemspec 语义版本控制运算符 ~>(又名 twiddle-wakka ,又名 pessimistic 运算符)允许限制 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 等...),我很想使用“>=”运算符,我们被告知is evil .

这种行为有原因吗?

编辑:

我把这个交给大卫,因为他在 ruby​​gems 中找到了罪魁祸首文件。有一个“功能”可以默默地将“3”扩展为“3.0”(Line 148 in version.rb:“单位数字版本会自动扩展为零以提供合理的结果。”)

我必须说我不同意结果是合理的,因为它打破了预期的顺序,并且阻止了能够与该运算符(operator)说“任何版本 x,但至少 3”。因此,我们被迫进入 >= which guides.rubygems.org warns us not to use .反正。也许这篇文章将作为我一直在寻找的文档...

最佳答案

通过查看 ruby​​gems 源代码(尤其是 requirement.rb、version.rb),悲观运算符至少需要两个版本控制段。

这也确实有道理。作为~> v.r只是不等式的语法糖

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

如果只有一个版本号,上限是多少?是的,∞(无穷大),所以没有必要让它起作用。您可以简单地将其写为 >= v .

关于ruby - 为什么 Gemfile 语义版本控制运算符 (~>) 会产生与一个数字不一致的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24121960/

相关文章:

ruby - 修复 "Nokogiri failed to build gem native extension"

ruby-on-rails - Mailcatcher 无法在临时服务器中工作

ruby - 将不带空格的字符串解析为单个单词的数组

ruby - 如何使用 RSpec 测试 JSON 对象中单个字段的值

ruby-on-rails - 我应该使用 Selenium 还是 Jasmine 来使用 RSpec 测试 View 文件?

ruby-on-rails - RestClient 只用最后一个散列去掉散列参数数组?

svn - 在 TeamCity 中获取子文件夹 svn 修订版

c++ - 在编译时使用 C++ 在目标代码中嵌入时间戳

npm - 当预发布版本是最新可用版本时,semver 中的插入符号 (^) 是否与预发布匹配?

ruby-on-rails - 如何向表单添加虚拟字段