使用工具提高 Rails 代码质量

每个人都可能用正确的风格写出质量低下的代码,这其中可能包括:

  • 重复的代码,它们可能存在于同一个类或不同类中
  • 不一致或没有标识性的对象、变量或方法命名
  • 过长的代码段
  • 让人费解的布尔表达式
  • 过于复杂的逻辑判断
  • 对象错误地暴露其内部状态
  • 遭废弃但没有删除的类或方法

对这些检查,仅靠工具可能就不够了。重构这些代码,需要我们先写测试,然后提 PR,找个人来帮我们 Review 这部分代码。

重构一个系统时,应该从引入工具开始。

CSS 无用代码检测

Dead Weight 可以检测你的项目中有哪些 CSS 选择器几乎从不使用,这样你可以安全的删除这些无用的样式。尴尬的是,这个 gem 已经不维护了。

现在推荐替代品 PurifyCSSUnCSS

代码风格检测

rubocop 是一个 Ruby 静态代码分析工具,它基于 Ruby 社区的代码风格指南

在 Gemfile 中增加

group :development do
  gem 'rubocop', require: false
end

在后面使用 -R 参数 适配 Rails 风格的检查。 在后面使用 -a 参数可以自动修复错误。

$ rubocop [options] [file1, file2, ...]
$ rubocop -R
$ rubocop app/models/entrance_guard/key.rb -a

test.rb:4:5: W: end at 4, 4 is not aligned with if at 2, 2

输出结构的第2个位置 W 指的是违规的等级,以此是:Convention, Warning, Error, Fatal。

然后在项目的根目录增加 .rubocop.yml 配置文件。

在 Atom 下配置:

gem install rubocop
apm install linter
apm install linter-rubocop
rbenv which rubocop
rubocop-auto-correct

去 Atom 的设置中把 rubocop-auto-correct 的自动纠正打开,再重启 Atom。

代码安全检测

brakeman 是一个 Ruby 静态代码安全检测工具。

在 Gemfile 中增加

group :development do
  gem 'brakeman', require: false
end

brakeman 的用法还是比较简单的,平时我们在项目的目录下直接执行 brakeman 就行。

关于 SQL 注入和 Rails 的安全还可参考如下:

依赖安全检测

bundle-audit 检查你用的 gem 是否有安全补丁需要升级。

在 Gemfile 中增加

group :development do
  gem 'bundler-audit', require: false
end

如果本地检测直接使用 bundle audit check --update

代码质量检测

rails_best_practices 可以检测 Rails 项目的代码质量,它可以提供一些改进代码的建议。比如使用 scope, 避免使用自动生成的路由,添加数据库索引等。虽然有时候这些建议并不符合你的实际情况,但仍然是一个不错的方法可以帮你的代码变得更干净。

ruby-metrics 也是很不错的工具。但是我更推荐 rubycritic 因为它的更新很活跃。

无效路由和控制器方法检测

traceroute 可以检测项目中没有使用的路由方法和控制器的动作。

综合代码质量审查

Code Climate 可以检测测试覆盖率、代码复杂度、重复的代码、安全问题、代码风格等关于代码质量的问题。它几乎集成了上面提到的全部工具。

用法还是比较简单的,团队的管理员按照说明设置一下 deploy key 就行。每次 PR 或 commit 后,Code Climate 收到 Github Webhooks 的调用开始进行统计。统计结果会在 PR 的页面或 Feed 中展现,你可以根据该结果决定是否 merge 这个 PR。

Code Climate 还提供了一个 Chrome Extension。装了这个插件后打开 Github 的页面,就能在浏览器里面看到 Code Climate 提供的 Code Review 和 测试覆盖率。

Code Climate 提供的命令行工具 Code Climate CLI 和 Atom Package,作用和 rubocop 几乎一样。所以可以根据喜好酌情安装。需要注意的是 Code Climate CLI 需要你安装 Docker。

Code Climate 和 Github 可以很好的结合到一起,参考这篇文档

CI 自动集成

travis-ci 没啥说的,贼好。

把 rubocop 集成到 workflow 中,可以在 CI 中配置 bundle exec rubocop

把 brakeman 集成到 workflow 中,可以在 CI 中配置 bundle exec brakeman -z

最后把 bundler-audit 集成到 workflow 中,可以在 CI 中配置

bundle exec bundle-audit update
bundle exec bundle-audit -v

如果你已经使用了 Code Climate,就不需要在 CI 中集成它们。

性能检测

遗留代码的重构

如果接盘了别人的代码,可以试试 suture

相关链接

如果觉得我的文章对您有用,请在支付宝公益平台找个项目捐点钱。 @Victor Sep 8, 2016

奉献爱心