为什么使用嵌套的Ruby模块来获取版本信息?

Joh*_*ley 5 ruby rubygems

我最近一直在寻找一些宝石的源代码.我一直看到的一个习惯用法是使用嵌套模块,其中包含连接到版本字符串的版本常量,即围绕这类事情的变化:

module ChunkyBacon
  module Version
    MAJOR = 0
    MINOR = 6
    TINY  = 2
  end

  VERSION = [Version::MAJOR, Version::MINOR, Version::TINY].compact * '.'
end
Run Code Online (Sandbox Code Playgroud)

以这种方式存储库版本信息的优点(如果有的话)是什么?为什么不这样做:

module ChunkyBacon
  VERSION = '0.6.2'.freeze
end
Run Code Online (Sandbox Code Playgroud)

Jör*_*tag 10

在字符串中包含版本信息通常是个坏主意.

例如,永远不会有Ruby 1.10,因为测试兼容性的太多应用程序if RUBY_VERSION > '1.6'会破坏.(因为字典顺序,1.10 < 1.6)这就是为什么有这种复杂的系统,哪里还有什么通常已经红宝石1.9.x的是,而不是红宝石1.9.0-X,什么一直红宝石1.10.x现在的Ruby 1.9.x的+ 1.因此,即将推出的Ruby版本,即Ruby 1.9.2,看起来像是一个不稳定的开发版本,实际上是Ruby 1.10.1,它是一个生产版本.

这导致了很多混乱.例如,即使是许多经验丰富的Ruby社区领导者,仍然在传播Ruby 1.9作为开发版本的错误信息,尽管版本控制策略的变化已被广泛传播.

Opera Web浏览器是另一个例子.当Opera 10.0发布时,它最初报告的版本号为10.0.然而,在最糟糕的时候,很明显许多网站,其中非常大和备受尊重的网站,完全打破了,因为Opera是第一个达到10.0的主流浏览器,这些网站正在进行简单的字符串比较,因此认为他们正在处理Opera 1.0,它不支持JavaScript或CSS.该唯一可行的解决方案是,歌剧10.0打印9.80的版本最终发行数量.

Mark Russinovich在他关于微软PDC的Windows 7内核的演示中也有一个关于比较版本号的咆哮.他向听众解释为什么Windows 7的版本号(在早期版本中曾经是7版)在版本中为6.1.原因是许多应用程序降级或无法工作.有些人只是检查if major == 6 then enhanced_vista_mode else crappy_xp_mode他们会在Windows 7中运行降级的方式.其他人甚至更具侵略性并且有类似的东西if major == 6 then enhanced_vista_mode elsif major == 5 then crappy_xp_mode else unsupported_windows_version,他们会拒绝工作.(这当然是愚蠢的,因为Windows 7完全向后兼容Vista.)

因此,微软将版本号更改为6.1,Russinovich说,半开玩笑,半悲伤和严肃,这显然意味着Windows 8的版本号必须是6.1.1.等等.

因此,长话短说:程序员自己解析版本号太愚蠢,你必须为他们做.


Dav*_*her 8

对于编程兼容性检查,更容易使用明确分隔的版本号.

例如:

require 'chunkybacon'
if ChunkyBacon::VERSION::MAJOR > 0
  # barf
end
Run Code Online (Sandbox Code Playgroud)