rubocop とは
コーディング規約に準拠してるかチェックするgemです!
簡単に言いますと、インデントやメソッド名、改行などのチェックをしてくれるものです。
今回は、このrubocopさんについてを会社のプロダクトにいれた時(後入れ)のやり方も交えて書きます。
流れ
gem 'rubocop'
gem 'rubocop-rails'
$bundle install
-
$rubocop
で実行(たぶんめちゃめちゃ怒られます。。。) - 怒られた箇所修正!!!
.rubocop.yml を作成!
プロジェクト直下に「.rubocop.yml」を作成!!
require:
- rubocop-rails
Rails:
Enabled: true
AllCops:
Exclude:
- 'db/schema.rb'
- 'vendor/**/*'
# 日本語でのコメントを許可
AsciiComments:
Enabled: false
このようなrubocop に対して制御するファイルを作成することで、ひとつひとつを修正していける!
(実際はその人や会社によってもっと設定がいることもあります。)
と簡単そうですが、後入れの場合、まぁーめちゃくちゃ怒られます!
そこで、私が実際にやったやり方は、
$bundle exec rubocop -R --auto-gen-config --exclude-limit 999999
オプションつけてrubocop コマンドを叩くと、「.rubocop_todo.yml」が作られます!!
このファイルは、現コードに対する一時回避の設定をしてくれます!これによって、怒られなくなります。
つまり、このファイルがなくてもエラーが起きないことがゴールです〜
このファイルをもとに「.rubocop.yml」を設定していきます!
実際の流れ
0.はじめに
inherit_from: .rubocop.yml
これを記述して、両方のファイルが参照されるようにしておく!
or
.rucocop_todo.yml
の内容を.rubocop.yml
に全コピー
-
copを一個コメントアウト(削除)
-
$rubocop
何で怒られているかチェック
-> 直したくない(これからもこのcop に対しては無視したい)->3A
-> 直さないといけない->3B
3A.
例: AsciiCommentsに関しては、全ページで許可したい!
# cop でどのようなことが怒られたかとか、どうしたいかを明記しておいたほうが良さそう
AsciiComments:
Enabled: false
を追記
もしくは、
AsciiComments:
Exclude:
- 'app/models/hoge.rb'
3B.
$rubocop -a
自動で修正してくれる(これがめちゃ便利)単純にコードミスや可読性の高いコードにも直してくれる!
注:メソッドの名前などは直してくれない!!
ちなみに、私は$rubocop
回した段階で何で怒られているのかがわからないやつは、とりあえず$rubocop -a
を叩きました。
それで、diff でみてどう変更されたかを確認してました!!
流れに関してはこんなもんです!ひたすら、怒られているところの確認-> 修正 or 「cop」 無視
.rubocop.ymlの書き方について
rubocopの対象から除外するファイル指定
AllCops:
Exclude:
- db/schema.rb
- 'vendor/**/*'
copの無効化・有効化
Rails:
Enabled: true
Lambda:
Enabled: false
基本的には、cop は有効化されているのでEnabled: true
はそこまで使わないかも
Enabled: false
はcop 自体を無視したいときに使います!
warning のみを検知
Bundler/OrderedGems:
Severity: warning
warning レベルから取得
自動化
rubocop を最大活用するためには、自動化するしかないと思いまして、CircleCIと連携することにしました!
CircleCIに関しては、ここでは飛ばします笑
jobs:
build:
steps:
- run: bundle exec rubocop
と設定するだけです!
自動で回してくれます!
github と CircleCI の連携と CircleCI ファイルの中にrubocop のコマンドを設定することでgithub 上で結果を確認できます!
まとめ
そもそも導入した経緯-> レビューする人が忙しい!!細かい修正で何度もやり取りするのが無駄!
- チームみんなのコードで既存のcop の設定とは違う物が来たときなどのメンテナンスは、必要かなと。
- 私自身、プロダクトに導入したばかりで結果がまだわかっていないので、便利なのか、あまり良いかはまだわかっていません(今更ですが)
非常に良かった点
- まだ、コードを書き始めて長くない私にとって、
$rubocop -a
によって修正されたり、怒られたりすることでコードの違った書き方を勉強するいい機会になった!(実際これが一番でかい)
参考
https://qiita.com/kyohei_shimada/items/e739dec967eb5e61721c
https://blog-ja.sideci.com/entry/2015/03/12/160441