在Rails应用程序中查找未使用的代码

我如何find代码是什么,而不是在生产中运行?

该应用程序经过了充分的testing,但有很多testing未使用的代码。 因此,他们在运行testing时得到报道…我想重构和清理这个混乱,它不断浪费我的时间。 我有很多后台工作,这就是为什么我想要制作env来指导我。 在heroku上运行,我可以旋转dynos来补偿探查器的任何性能影响。

相关问题如何在Ruby应用程序中find未使用的方法? 没有帮助。

奖金:指示一行代码运行的频率。 不知道为什么我想要它,但我做到了! 🙂

在正常情况下,这个方法就是使用你的testing数据来代码覆盖,但是正如你所说的,你有一部分代码已经过testing,但是并没有在生产应用中使用,你可以做一些稍微不同的事情。

只是为了清晰起见: 不要相信自动工具。 他们只会显示你积极testing的结果,仅此而已。

随着我们背后的声明,我build议您在生产应用程序中使用代码覆盖工具(如Ruby 1.9的rcov或simplecov ),并测量用户实际使用的代码path。 虽然这些工具最初是为测量testing覆盖而devise的,但您也可以将它们用于生产覆盖

假设在testing期间访问了所有相关的代码path,您可以删除其余的代码。 不幸的是,这个假设很可能不会完全成立。 因此,在删除零件时,您仍然必须应用您对应用程序及其内部工作的知识。 这在删除声明性部分(如模型引用)时更为重要,因为这些部分通常不是直接运行,而是仅用于configuration系统的其他部分。

另一种可以与上述方法结合的方法是尝试将应用程序重构为可以打开和closures的高级function。 然后,您可以将怀疑未使用的functionclosures,并检查是否没有人抱怨:)

最后说明一下:你不会find一个神奇的工具来做你的全面分析。 这是因为没有工具可以知道某个代码是否被实际用户使用。 工具可以做的唯一事情就是创build(或多或less)静态可达性图,告诉你是否从某个特定点调用了你的代码。 对于像Ruby这样的dynamic语言,即使这样做也很难实现,因为静态分析并不能很好地理解在轨道上下文中大量使用的元编程或dynamic调用。 所以有些工具实际上运行你的代码或者试图从testing覆盖率中获得洞察力。 但是绝对没有魔法。

所以考虑到rails应用程序的高内部(大部分是隐藏的)复杂性,你不会亲自去做大部分的分析。 最好的build议可能是尝试模块化您的应用程序,并closures某些模块来testing它们不被使用。 这可以通过适当的集成testing来支持。

也许你可以尝试使用rails_best_practices来检查未使用的方法和类。

这里是在github: https : //github.com/railsbp/rails_best_practices 。

把'gem“rails_best_practices”'放在你的Gemfile中,然后运行rails_best_practices . 生成configuration文件

我遇到了同样的问题,在探索了一些替代品之后,我意识到我拥有所有可用的信息 – 日志文件。 我们的日志格式如下

 Dec 18 03:10:41 ip-xx-xx-xx-xx appname-p[7776]: Processing by MyController#show as HTML 

所以我创build了一个简单的脚本来parsing这个信息

 zfgrep Processing production.log*.gz |awk '{print $8}' > ~/tmp/action sort ~/tmp/action | uniq -c |sort -g -r > ~/tmp/histogram 

其中产生了访问给定的控制器#操作的频率的结果。

 4394886 MyController#index 3237203 MyController#show 1644765 MyController#edit 

下一步是将其与应用程序中的所有控制器#操作对列表进行比较(使用Rake路由输出或可以为testing套件执行相同的脚本)

检查盖带gem,它正是你正在寻找什么。

我不太熟悉Ruby和RoR,但是我会提出一些疯狂的猜测:

  • 添加:after_filter方法logging之前调用方法的名称(从调用堆栈中获取)到文件
  • 将其部署到生产中
  • 稍等片刻
  • 删除所有不在日志中的方法。

PS可能解决scheme与NetBeans中的Alt + F7或RubyMine好得多:)

您已经有了将可疑方法标记为私有的想法(可能会破坏您的应用程序)。

我过去做了一个小小的变化:在所有可疑的方法上添加一小段代码来logging它。 在我的情况下,这是一个用户popup“你称为一个过时的function – 如果你真的需要请联系信息技术”。 在一年之后,我们很好地总结了真正使用的东西(这是一个商业应用程序,每年只需要一次function)。

在你的情况下,你应该只logging使用情况。 所有未经过合理时间logging的东西都未被使用。

元编程

对象#method_missing的

重写Object#method_missing 。 在里面,将调用的方法asynchronous地logging到数据存储中。 然后根据传递给method_missing参数,用适当的参数手动调用原始方法。

对象树

然后将数据存储中的数据与应用程序对象树的内容进行比较。

免责声明:这肯定需要显着的性能和资源考虑。 另外,要做到这一点还需要一些修补,但理论上应该起作用。 我会把它作为一个练习原始的海报来实现它。 ;)

你有没有尝试使用类似sahi创build一个testing套件,然后使用这个logging所有的用户journies,并将这些testing绑定到rcov或类似的东西。

你必须确保你有所有的用户journies,但之后,你可以看看rcov吐出什么,至less开始削减显然是从来没有覆盖的东西。

这不是一个非常积极主动的方法,但是我经常使用New Relic收集的结果,看看在过去一个月左右的时间里,是否有人怀疑我曾经被怀疑过的未使用的东西。 我使用过的应用程序虽然很小,但对于较大的应用程序而言,它的价格却相当昂贵。

我从来没有用过它,但是这个关于激光gem的 post似乎是在谈论解决你的确切问题。

这不是完美的解决scheme,但是例如在NetBeans中,通过右键单击它们(或按Alt + F7),可以find方法的用法。
所以如果方法未被使用,你会看到它。

将可疑方法标记为私有。 如果这不会破坏代码,请检查方法是否在类中使用。 那么你可以删除的东西