从事 Ruby 类库或应用工作的开发者现在有了新的任务:确保不同 Ruby 版本间代码的兼容性。各种可选的 Ruby 实现是原因之一,不过它们的共同目标都是和 MRI 的工作方式保持一致。但是有了 Ruby 1.9 发布以后,情况就有了变化: Ruby 1.9 有了些不兼容性的变化,或是至少修改了一些代码的行为。
例如,在 1.9 之前,Ruby 块中的本地变量存在着问题:
a = 1<br></br> foo.do_something {|a|<br></br> a = 42<br></br> }<br></br> 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<br></br> 42<br></br>RESULT = 0<p>VERSION = 1.9.0-0</p><br></br> 1<br></br>RESULT = 0<p>TOTAL RESULT = 0</p><br></br> failures out of 2<p>Passed: 1.8.6-p111, 1.9.0-0 </p><br></br>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 上测试你的类库或者应用了吗?
评论