我在哪里可以find一个积极开发的Ruby的皮棉工具?

我写的大部分代码都是在Ruby中,每隔一段时间,我都会犯一些错误,而这些错误只会在一段时间后才会被捕获。 当我的脚本运行长时间的任务时,这是令人烦恼的,并返回find我有一个错字。

是否有一个积极开发的rubylint工具,可以帮助我克服这一点? 是否有可能通过一个与许多源文件一起工作的系统来使用它,其中一些是dynamic加载的?

以这个片段为例:

a = 20 b = 30 puts c 

为了赢得赏金,给我看一个将检测cvariables为未创build/未定义的工具。

你可以尝试一下Diamondback Ruby 。 它做了一个Ruby代码的静态types检查,并会因此使用一个未定义的variables。

虽然DRuby是一个正在进行的研究项目,但对于小型,自包含的Ruby脚本来说,它已经非常好用了。 目前,它无法分析许多Ruby标准库的“开箱即用”(out-of-the-box)。 目前,他们正在努力打造Ruby on Rails(请参阅他们最近的论文 )。

  • ruby -c myfile.rb将检查正确的Ruby语法。
  • Reek检查Ruby代码是否存在常见的代码异味。
  • Roodi检查Ruby代码是否存在面向对象的通用devise问题。
  • Flog可以警告你非常复杂的代码。

[Plug]如果你的项目在一个公共的Github仓库中, Caliper每次提交时都可以运行代码中的后三个工具和其他工具。 (免责声明:我在Caliper上工作)

RubyMine ( http://www.jetbrains.com/ruby )有诀窍:

替代文字http://img707.imageshack.us/img707/5688/31911448.png

以下都不会做RubyMine所做的所有分析。

  • NetBeans Ruby包
  • Aptana RadRails
  • gVIM(通过scrooloose合成插件)

它们中的每一个都有能力识别语法错误,比如错误的括号,太多的defs,ends,braces等等,但是没有一个会像RubyMine那样识别无效的方法调用。

原因如下:这很困难。

由于Ruby是非常dynamic的(像'c'这样的方法可以很容易地在运行中生成),任何试图识别不存在的variables/方法的编辑器都需要加载整个环境的大部分,并且需要多个程序streampath不断testing,以获得准确的“有效性”结果。 这比Java中几乎所有的编程都是静态的(至less是我丢弃那个帽子的时候)要困难得多。

这种轻松生成方法的能力是社区对这种高度尊重进行testing的原因之一。 我真的build议你尝试一下testing。

看看RuboCop 。 这是一个基于Ruby风格指南的Ruby代码风格检查器。 它保持相当活跃,并支持所有主要的Ruby实现。 它适用于Ruby 1.9和2.0,并具有很好的Emacs集成。

是。 Test::Unit

好的,我知道你已经知道这个,从某种意义上说,这是一个没有帮助的答案,但是你确实提出了鸭子打字的负面影响,那么(现在)没有办法只是写更多的testing比Java可能需要的东西。

因此,为了logging,请参阅Ruby标准库中的Test::Unit或其他testing框架之一。

有unit testing,你可以运行和重新运行是捕捉错误的最好方法,你需要更多的(dynamic语言,如Ruby的testing,而不是错误:-) …

挑剔可能是你正在寻找的东西。

有了这个代码:

 class MyString < String def awesome self.gsub("e", "3").gsub("l", "1").uppercase end end puts MyString.new("leet").awesome 

输出:

 $ nitpick misspelling.rb *** Nitpick had trouble loading "misspelling.rb": NoMethodError undefined method `uppercase' for "133t":MyString Nothing to report boss! He's clean! 

还没有使用它,但听起来很有希望(当我testing这个时会更新)。

https://github.com/michaeledgar/laser

Ruby代码的静态分析和样式linter。

Pelusa很好,但是只在rubinius工作。 不过,对于那些和RVM相似的人来说,这并不是一件好事。

 avdi@lazarus:~$ irb >> a = 20 => 20 >> b = 30 => 30 >> puts c NameError: undefined local variable or method `c' for main:Object from (irb):3 >> 

在那里,这个工具被称为“IRB”。 我得到赏金吗?

我只是半开玩笑。 我写了第二个答案,希望能够回到Ruby中,如果你想知道某些东西是被定义的, 你必须运行代码