用Multiruby检查1.8和1.9的兼容性

从事Ruby类库或应用工作的开发者现在有了新的任务:确保不同Ruby版本间代码的兼容性。各种可选的Ruby实现是原因之一,不过它们的共同目标都是和MRI的工作方式保持一致。但是有了Ruby 1.9发布以后,情况就有了变化: Ruby 1.9有了些不兼容性的变化,或是至少修改了一些代码的行为。

例如,在1.9之前,Ruby块中的本地变量存在着问题:
 a = 1
 foo.do_something {|a|
 a = 42
 }
 puts a
在Ruby 1.8中,这段代码会打印出“42”, 因为块变量a和所包含域中的a就是一个变量。Ruby 1.9解决了这个问题,块的行为和人们的预期达成了一致,也就是打印出“1”。所以,如果某个类库或者应用的代码依赖于旧的行为,那它在Ruby 1.9中的表现肯定就不一样了。

Zentest包中的Multiruby可以有助于避免这个问题。 Zentest的创建者 Ryan Davis解释了怎样用Multiruby处理Ruby 1.8和1.9:
现在有了1.9,该讨论一下怎样用Multiruby来进行多版本测试了。Multiruby在Zentest家族内的知名度不太高。它会自动构建并在内部安装多个ruby版本,并向所有版本发送多重命令,这样你就可以同时贯穿多个ruby版本执行测试。
安装Zentest很简单:
gem install ZenTest 
Multiruby的工作机制如下:
  • 它会下载Ruby版本——如1.8和1.9——并进行编译
  • 然后它会在每个可用的Ruby版本上执行它的参数
multiruby这个命令会将所有给定的参数传递给Ruby二进制文件。运行上面的代码示例会得到如下的输出:
VERSION = 1.8.6-p111
 42
RESULT = 0

VERSION = 1.9.0-0
 1
RESULT = 0

TOTAL RESULT = 0
 failures out of 2

Passed: 1.8.6-p111, 1.9.0-0
Failed:
可以看到:在1.8.x上面的输出结果是“42”,但是在1.9上面就变成了“1” (上面的“RESULT”是Ruby解释器的退出代码)。

通常,Multiruby只用来在大部分代码都 被测试覆盖的情况下找出问题所在。但是如今Ruby正是一个英雄辈出的时代,像JRuby 1.0和1.1、IronRuby还有Rubinius如雨后春笋般纷纷涌现,有一个可以简化跨运行时测试的工具正是当务之急。

你已经开始向Ruby 1.9移植你的应用,或至少是开始在Ruby 1.9上测试你的类库或者应用了吗?

查看英文原文: Checking 1.8 vs 1.9 compatibility with Multiruby

你可能感兴趣的:(用Multiruby检查1.8和1.9的兼容性)