Ruby < 2.0.0 的代码检查

Linting for Ruby < 2.0.0

我有一个包含许多 Ruby 文件的项目,由带有嵌入式 Ruby 解释器(和其他一些库)的外部程序加载。我正在尝试使用 RubyMine 和 Rubocop 来帮助开发,但问题是所述嵌入式解释器的版本为 1.9.2,无法以任何方式升级。是否可以在 RubyMine 中仍然使用 Rubocop 或其他 linter,同时确保代码与旧解释器兼容?

简短的回答是可以,可以更改 Ruby我的 linter,JetBrains 网站上有完整的演练说明如何操作。我不知道有什么特别适用于 Ruby 2.0 之前版本的 linter,更不用说它们不存在了。

更长的答案是,如果解释器是 运行 通过另一个程序,而不是使用真正的 Ruby 安装,它真的不会有太大区别,并且任何 linter 都不会可靠地为您工作。将有大量代码 linter 仍然认为完全可以接受,但在嵌入式 VM 中 运行 时会失败。

# Linter thinks this perfectly fine, part of 1.9.2 standard library
require 'base64' 

# Still thinks this perfectly fine. This all fails miserably though
Base64.encode64('My string')

最明显的例子是整个标准库、gems、rake 以及任何不属于 "core" 库的东西。基本经验法则,如果您必须 require 一个脚本(不包括您项目的本地脚本),它是行不通的。

它永远不可靠的另一个原因是您不知道嵌入式 Ruby 解释器是否已被更改,或出于他们的目的从 Ruby 中删除了功能,而 linter 甚至可以了解这一点的方式更少。多年前,我涉足了 RPG Maker 系列,发现他们的某些内置 Ruby 功能已从他们的自定义构建中删除(或至少隐藏)。

如果您熟悉 Ruby,那么您显然可以避开 Ruby 对核心库实施的主要和最常见的 2.0+ 更改,但这是唯一可靠的了解方式(即使有 linter),正在测试,无论如何你都需要做(或者至少你应该)。 Ruby我的很好地支持使用 Minitest 和 RSpec 自动执行此操作。

是的,你可以,Check this out 然后让 RuboCop 知道你的项目支持更新的 Ruby 的最旧版本。rubocop.yml 文件:

AllCops:
  TargetRubyVersion: 1.9