53
63

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[rails] rubocopとは?

Last updated at Posted at 2019-05-24

rubocop とは

コーディング規約に準拠してるかチェックするgemです!
簡単に言いますと、インデントやメソッド名、改行などのチェックをしてくれるものです。
今回は、このrubocopさんについてを会社のプロダクトにいれた時(後入れ)のやり方も交えて書きます。

流れ

gem 'rubocop'
gem 'rubocop-rails'
  • $bundle install
  • $rubocop で実行(たぶんめちゃめちゃ怒られます。。。)
  • 怒られた箇所修正!!!

.rubocop.yml を作成!

プロジェクト直下に「.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.はじめに

.rubocop_todo.yml
inherit_from: .rubocop.yml

これを記述して、両方のファイルが参照されるようにしておく!
or
.rucocop_todo.ymlの内容を.rubocop.ymlに全コピー

  1. copを一個コメントアウト(削除)

  2. $rubocop何で怒られているかチェック
    -> 直したくない(これからもこのcop に対しては無視したい)->3A
    -> 直さないといけない->3B

3A.
例: AsciiCommentsに関しては、全ページで許可したい!

.rubocop.yml
# cop でどのようなことが怒られたかとか、どうしたいかを明記しておいたほうが良さそう
AsciiComments:
  Enabled: false

を追記
もしくは、

.rubocop.yml
AsciiComments:
  Exclude:
    - 'app/models/hoge.rb'

3B.
$rubocop -a自動で修正してくれる(これがめちゃ便利)単純にコードミスや可読性の高いコードにも直してくれる!
注:メソッドの名前などは直してくれない!!

ちなみに、私は$rubocop回した段階で何で怒られているのかがわからないやつは、とりあえず$rubocop -aを叩きました。
それで、diff でみてどう変更されたかを確認してました!!

流れに関してはこんなもんです!ひたすら、怒られているところの確認-> 修正 or 「cop」 無視

.rubocop.ymlの書き方について

rubocopの対象から除外するファイル指定

.rubocop.yml
AllCops:
  Exclude:
    - db/schema.rb
    - 'vendor/**/*'

copの無効化・有効化

.rubocop.yml
Rails:
  Enabled: true
.rubocop.yml
Lambda:
  Enabled: false

基本的には、cop は有効化されているのでEnabled: trueはそこまで使わないかも
Enabled: falseはcop 自体を無視したいときに使います!

warning のみを検知

.rubocop.yml
Bundler/OrderedGems:
  Severity: warning

warning レベルから取得

自動化

rubocop を最大活用するためには、自動化するしかないと思いまして、CircleCIと連携することにしました!
CircleCIに関しては、ここでは飛ばします笑

.circleci/config.yml
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

53
63
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
53
63

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?