我最近一直在寻找一些宝石的源代码。我一直看到的一个成语是使用嵌套模块,其中包含连接到版本字符串的版本常量,即围绕此类事物的变体:
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
答案 0 :(得分:10)
在字符串中包含版本信息通常是一个坏主意。
例如,永远不会成为Ruby 1.10,因为使用if RUBY_VERSION > '1.6'
测试兼容性的应用程序太多会破坏。 (因为按字典顺序,1.10 < 1.6
)这就是为什么有这个复杂的方案,其中 通常是Ruby 1.9.x而不是Ruby 1.9.0-x和会已经Ruby 1.10.x现在是Ruby 1.9.x + 1。所以,即将推出的Ruby版本,即Ruby 1.9.2,以及看起来就像是一个不稳定的开发版本,真的 Ruby 1.10.1,这是一个生产版。
这导致了很多混乱。例如,即使是许多经验丰富的Ruby社区领导者,仍在传播Ruby 1.9是一个开发版本的错误信息,尽管版本政策的变化已被广泛传播。
Opera网络浏览器是另一个例子。当Opera 10.0发布时,它最初报告的版本号为10.0。然而,在最糟糕的时候,很明显许多网站,其中非常大和备受尊重的网站,完全打破了,因为Opera是第一个达到10.0的主流浏览器,这些网站正在进行简单的字符串比较,因此认为他们正在处理Opera 1.0,它不支持JavaScript或CSS。 唯一可行的解决方案是Opera 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。等等。
所以,长话短说:程序员自己解析版本号太愚蠢了,你必须为他们做。
答案 1 :(得分:8)
对于编程兼容性检查,更容易获得明确分隔的版本号。
e.g:
require 'chunkybacon'
if ChunkyBacon::VERSION::MAJOR > 0
# barf
end