代码之家  ›  专栏  ›  技术社区  ›  John Topley

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

  •  5
  • John Topley  · 技术社区  · 15 年前

    我最近一直在研究一些gem的源代码。我一直看到的一个习惯用法是使用一个嵌套模块,该模块包含连接到版本字符串中的版本常量,即围绕这类事情的变体:

    module ChunkyBacon
      module Version
        MAJOR = 0
        MINOR = 6
        TINY  = 2
      end
    
      VERSION = [Version::MAJOR, Version::MINOR, Version::TINY].compact * '.'
    end
    

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

    module ChunkyBacon
      VERSION = '0.6.2'.freeze
    end
    
    2 回复  |  直到 15 年前
        1
  •  8
  •   Dave Bacher    15 年前

    对于编程兼容性检查,使用显式分隔的版本号更容易。

    例如。:

    require 'chunkybacon'
    if ChunkyBacon::VERSION::MAJOR > 0
      # barf
    end
    
        2
  •  10
  •   Jörg W Mittag    15 年前

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

    例如,可以 从未 作为Ruby1.10,因为测试兼容性的应用程序太多 if RUBY_VERSION > '1.6' 会破裂。(因为从词典学上, 1.10 < 1.6 )这就是为什么有这么复杂的计划 通常是Ruby1.9.x,而不是Ruby1.9.0-x,以及 一直是Ruby 1.10.x现在是Ruby 1.9.x+1。所以,即将发布的Ruby版本,即Ruby1.9.2,以及 就像它是一个不稳定的开发版本,是 真正地 Ruby1.10.1,这是一个生产版本。

    这会导致很多混乱。例如,即使是许多经验丰富的Ruby社区领导者,仍在散布关于Ruby1.9是开发版本的错误信息, 尽管 版本控制策略的变更已经被广泛传播。

    Opera Web浏览器是另一个例子。当Opera10.0发布时,它最初也报告了它的版本号,以及10.0。然而,在betatest期间,很明显许多网站,其中非常大和受人尊敬的网站,完全破产了,因为Opera是第一个进入10.0的主流浏览器,这些网站正在做简单的字符串比较,因此认为他们正在处理Opera 1.0,它不支持javascript或css。这个 只有 可行的解决方案是Opera10.0的最终版本将9.80打印为版本号。

    MarkRussinovich在介绍微软PDC的Windows7内核时,对比较版本号也大发雷霆。他向观众解释了为什么早期版本中的Windows7的版本号是6.1。原因是许多应用程序要么降级,要么根本无法工作。有些人会简单地检查 if major == 6 then enhanced_vista_mode else crappy_xp_mode 这意味着它们将在Windows7中降级运行。其他人更具侵略性 if major == 6 then enhanced_vista_mode elsif major == 5 then crappy_xp_mode else unsupported_windows_version 他们会拒绝工作。(这当然很愚蠢,因为Windows7与Vista完全向后兼容。)

    因此,微软将版本号改为6.1,而Russinovich半开玩笑,半悲伤,严肃地说,这显然意味着Windows8的版本号必须是6.1.1。等等。

    所以,长话短说吧:程序员太笨了,不能自己解析版本号,你 必须 为他们做。

    推荐文章