如何检查 API 版本之间的 Ruby 兼容性?

How to check for API compatibility between Ruby versions?

我们的团队维护着一个 ruby 脚本,该脚本必须支持任何 ruby >= 1.9.3(是的,这是一个相当旧的 ruby 版本,但这是我们无法控制的此时此刻)。最近,我们添加了一项更改,其中包括使用 match? 验证正则表达式并且一切顺利,直到其中一位用户报告说该脚本在 ruby 2.3 中爆炸并显示消息:

undefined method `match?' for #<Regexp:0x000000018471e0> (NoMethodError)

原来发生这种情况是因为 match? 方法在 ruby >= 2.4 中可用。

我们 运行 ruby -c script.rb 有多个 ruby 版本(1.9.3、2.0.0、2.1.10、2.3.7、2.5.1、2.6。 3, 2.7.4) 作为我们测试套件的一部分,这并没有显示为语法错误,我怀疑这是因为实际语法是“正确的”,但该方法在 [=26= 的某些版本中根本不可用].我们也尝试了rubocop,希望它能检测到这些不兼容问题,但它也不报告任何错误。

所以,我的问题是,检查多个 ruby 版本之间的 API 兼容性问题的最佳方法是什么?

你们有自动化测试套件吗?如果是这样,您可以设置 CI 以针对多个 Ruby 版本进行测试,例如:

https://github.com/actions/setup-ruby#usage

(编辑:我看到你确实提到了一个测试套件,所以听起来你在测试覆盖率方面存在差距,或者你不是 运行 针对每个 Ruby 版本的测试?).

运行宁 ruby -c 与您支持的最早的 Ruby 是一个好的开始,因为它会检测您是否正在尝试使用更新的语法。

使用新方法:

  1. 运行 您想要支持的最旧和最新 Ruby 版本的测试套件。

  2. 考虑使用我的 backports gem,这样即使在旧红宝石上也可以使用更新的 API。例如,它包括 Regexp.match? 数百个反向移植...