我在哪里可以找到一个积极开发的Ruby工具?

时间:2009-11-26 18:45:30

标签: ruby code-analysis static-analysis lint

我编写的大多数代码都是在Ruby中,每隔一段时间,我就会制作一些错字,只会在一段时间后被捕获。当我的脚本运行很长的任务时,这很烦人,然后回来发现我有一个错字。

Ruby是否有积极开发的lint工具可以帮助我克服这个问题?是否可以在一个使用大量源文件的系统中使用它,其中一些是动态加载的?

以此片段为例:

a = 20
b = 30
puts c

要获得赏金,请告诉我一个工具,它会将c变量检测为未创建/未定义。

9 个答案:

答案 0 :(得分:24)

  • ruby -c myfile.rb将检查正确的Ruby语法。
  • Reek检查Ruby代码以查找常见代码气味。
  • Roodi检查Ruby代码以查找面向对象的常见设计问题。
  • Flog可以警告您异常复杂的代码。

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

答案 1 :(得分:13)

您可以尝试Diamondback Ruby。它执行Ruby代码的静态类型检查,因此会责怪您使用未定义的变量。

虽然DRuby是一个正在进行的研究项目,但它已经适用于小型,自包含的Ruby脚本。目前,它无法分析大量的Ruby标准库“开箱即用”。目前,他们正在努力键入Ruby on Rails(请参阅他们的most recent papers)。

答案 2 :(得分:11)

RubyMinehttp://www.jetbrains.com/ruby)可以解决问题:

alt text http://img707.imageshack.us/img707/5688/31911448.png

以下所有内容都不会执行RubyMine所做的所有分析。

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

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

原因如下:这很难。

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

这种轻松生成方法的能力是社区对这种高度尊重进行测试的原因之一。我确实建议您尝试测试。

答案 3 :(得分:7)

看看RuboCop。它是基于Ruby Style Guide的Ruby代码样式检查器。它非常积极地维护并支持所有主要的Ruby实现。它适用于Ruby 1.9和2.0,并且具有出色的Emacs集成。

答案 4 :(得分:5)

是。 Test::Unit

好的,我知道你已经知道了这一点,从某种意义上来说这是一个无用的答案,但你确实提出了鸭子打字的负面后果,那就是(此时)没有办法解决编写比Java更多的测试可能需要。

因此,有关记录,请参阅Ruby标准库中的Test::Unit或其他测试框架。

拥有可以运行和重新运行的单元测试是捕获错误的最佳方法,并且在Ruby等动态语言中确实需要更多(测试,而不是错误:-) ...

答案 5 :(得分:2)

nitpick可能就是你要找的东西。

使用此代码:

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!

答案 6 :(得分:0)

尚未使用它,但听起来很有希望(当我测试时会更新)。

https://github.com/michaeledgar/laser

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

答案 7 :(得分:0)

Pelusa很不错,但只在rubinius工作。对于熟悉RVM的人来说,这不是一个问题。

答案 8 :(得分:-1)

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中找到答案,如果你想知道某些内容是否被定义,你必须运行代码