【Rails】RuboCopの導入 ~ おすすめルールの設定方法

Ruby on Rails

はじめに

この記事の概要

こんにちは、株式会社TOKOSのツキヤです!
今回はRuby(on Rails)のチーム開発では必須と言っても良いほどのgem「RuboCop」について、簡単な説明から導入方法 ~ 個人的なおすすめの設定を解説しようと思います😎
特に設定ファイルについては、自分なりに試行錯誤してかなりいい感じに仕上がっているのでぜひ参考にして下さい🙏

対象読者

  • 自分のコードをよりキレイにしたい方
  • Ruby, Railsのチーム開発でコーディングのルールを決めたい方
  • RuboCopの程良い設定を参考にしたい方

RuboCopとは

まずざっくりとRuboCop自体の解説をします!
RuboCopとは、自分(チームメンバー)が書いたコードを1コマンドで解析してくれて、良くない点やもっと良い書き方を指摘してくれるgemです!
更に、修正してくれる部分は自動で修正までしてくれる優れモノです💪

例えば、

if @user.present?
  return user.name
end

↑ このような記述に対して、

return user.name if @user.present?

↑ このように後置ifに自動で直してくれます!

後置ifだけでは無く、自分が知らなかったような記述方法も教えてくれるのでRuby力アップの参考にもなります✨
また、どれくらいの縛りのルールにするかも設定ファイルで細かくカスタマイズできます!

ツキヤ
ツキヤ

例えばだけど、変数名の最大文字数や1行あたりの最大文字数みたいなルールもあるよ!

デフォルトのルールだとこういうのがけっこう縛りがキツい時があるから自分でいい感じに緩めたいね!

導入方法

インストール

早速インストールしてみます!

# 中略
group :development do
  # 中略
  gem 'rubocop', require: false
  gem 'rubocop-performance', require: false
  gem 'rubocop-rails', require: false
end

上記の3つのgemをインストールします!
rubocopがRuboCopの本体で、他の2つは追加のルールを設定するために入れます!
特に、rubocop-railsはrailsに対する色々な設定を追加できるのでぜひ入れましょう💪

また、RuboCopは開発環境でしか使わないのでdevelopmentのグループに、毎回requireする必要が無いのでrequire: falseをつけておきます!

$ bundle install

忘れずにbundle installをしておきましょう🥳

初期設定

次に、下記コマンドで初期設定を行います

$ bundle exec rubocop --auto-gen-config

このコマンドで

  • .rubocop.yml
  • .rubocop_todo.yml

の2ファイルが作成されるかと思います!
それぞれのファイルの説明は後で行います!

一旦これでRuboCopを使う準備は完了で、あとは行いたいタイミングで、

$ bundle exec rubocop

と打つだけで、すべてのファイルを確認しながらコードがルールに沿っているか調べてくれます!

問題無ければ、下記画像のように「no offenses」と緑の文字で表示されます!

ツキヤ
ツキヤ

「34 files inspected」となっているのは、RuboCopが34ファイルをチェックしているということだね!

問題がある場合は下記画像のようになります

「3 offenses detected, 3 offenses autocorrectable」となっています😱

赤字の方が、実際にどれだけのルールエラーが起きているかを表しています!
「3 offenses detected」となっているので、3つのルール違反が検出されたということですね!

実際のルール違反の内容は上にかいてあるものとなります!
今回は「Style/GuardClause」「Style/IfUnlessModifier」「Style/RedundantCondition」の3つです!
ルールの内容はかなり多くて全部解説はできないので、下記リンクを参考にしてください🙇‍♂️

また、黄色の文字で書かれている方が、RuboCopが自動で修正してくれるルール違反の数です!
「3 offenses」となっていて、赤字のoffenses数と同じなので全て自動で修正してくれることになります✨
下記コマンドを打つことで自動修正をしてくれます!

$ bundle exec rubocop -a

実際に打ってみると、下記画像のような結果が出ました!

色々書いてあるますが、最後の「7 offenses detected, 7 offenses corrected」ですべて修正されたことが分かります!
数字が3から7に増えているのは、修正途中でまた他のルール違反が出てしまい、それを更に修正したからなのであまり気にしなくて大丈夫です💪

最後にもう1度「$ bundle exec rubocop」で確認してみると、

無事緑のみになりました!!

ツキヤ
ツキヤ

緑のドットの数がルールに沿ったファイルの数だね!

.rubocop.yml

ここからは、作成されたファイルの説明をします!

.rubocop.ymlは、ルールの設定自体を細かく設定できるファイルです!
初期の状態は下のように1行だけかと思います

inherit_from: .rubocop_todo.yml

これは、「.rubocop_todo.ymlに書いてある内容はルール違反してても無視して下さい」という意味になります!

他にも色々カスタマイズできます!
後でおすすめルールを解説しますのでお待ち下さい🙏

.rubocop_todo.yml

このファイルは、先程も少し解説したのですが、「ルール違反を無視したい内容を書き込む」ファイルになります!
先程「$ bundle exec rubocop –auto-gen-config」コマンドを打っていただきましたが、このコマンドの内容は

現在ルール違反を起こしているファイル、違反内容をすべて.rubocop_todo.ymlに書き込みなさい

という意味のコマンドです!
なので、RuboCopを導入する際はこのコマンドを打ち込んで一旦エラーが無い状態にします。その上で少しづづ.rubocop_todo.ymlの内容を削除して最終的に空のファイルにすることを目指します😎

または、どうしてもRuboCopのルールに逆らいたい時もあるかと思いますので、その場合にも役立ちます!

おすすめルール

ここからは、.rubocop.ymlの僕のおすすめルールを解説します!
僕の独断と偏見で、やや緩めのルールになっていますのでお好みでカスタマイズしてみて下さい!

まずはファイル全体を載せます!

inherit_from: .rubocop_todo.yml

require:
  - rubocop-performance
  - rubocop-rails

AllCops:
  SuggestExtensions: false
  # 最新のルールを適用する
  NewCops: enable
  # 何のルールに引っかかったか表示する
  DisplayCopNames: true
  # rubocop対象外(リポジトリ毎で調節)
  Exclude:
    - "Gemfile"
    - "bin/**/*"
    - "db/**/*"
    - "log/**/*"
    - "tmp/**/*"
    - "vendor/**/*"
    - "lib/tasks/auto_annotate_models.rake"
    - "config/environments/*"
    - "config/puma.rb"

### ルールのカスタマイズ

# 設定が厳しいので一旦全てfalseにする
Metrics:
  Enabled: false

# 一行あたりの文字数
Layout/LineLength:
  Enabled: false

# メソッドの改行ルール
Layout/MultilineMethodCallIndentation:
  EnforcedStyle: indented

# 日本語にコメントを許可
Style/AsciiComments:
  Enabled: false

# クラスにコメントを残さなくても良い
Style/Documentation:
  Enabled: false

# コントローラ等のモジュールをネストしての宣言
Style/ClassAndModuleChildren:
  Enabled: false

# 文字列のfreeze(Ruby3からは自動でfreezeされるので要らない)
Style/FrozenStringLiteralComment:
  Enabled: false

# ガード節の提案(難しいので一旦false)
Style/GuardClause:
  Enabled: false

# 文字列のダブルクォートチェック
Style/StringLiterals:
  Enabled: false

# シンボルによる配列の%記法のチェック
Style/SymbolArray:
  Enabled: false
  # EnforcedStyle: brackets

# 文字列による配列の%記法のチェック
Style/WordArray:
  Enabled: false

# 変数名に数字を許可
Naming/VariableNumber:
  Enabled: false

# = と == の指摘
Lint/AssignmentInCondition:
  Enabled: false

# メソッド名等の命名の指摘
Naming/PredicateName:
  Enabled: false

# 未i18nのチェック(バリデーションエラーメッセージをi18nに登録するのはやや冗長?なためfalse)
Rails/I18nLocaleTexts:
  Enabled: false

# before_actionの際の未定義メソッドのチェック(deviseとの兼ね合いで一旦false)
Rails/LexicallyScopedActionFilter:
  Enabled: false

基本的にはルールを緩くする方向の設定をしています!
重要な部分だけ解説していきます!

require:

require:
  - rubocop-performance
  - rubocop-rails

この部分に「rubocop-performance」「rubocop-rails」と記述することで、追加でinstallしたgemのルールを適用することができます!
Railsを使っている場合はこの2つは入れておいて損は無いでしょう💪

AllCops:

AllCops:
  # 結果のsuggest部分を非表示にする
  SuggestExtensions: false
  # 最新のルールを適用する
  NewCops: enable
  # 何のルールに引っかかったか表示する
  DisplayCopNames: true
  # rubocopの対象外ファイル
  Exclude:
    - "Gemfile"
    - "bin/**/*"
    - "db/**/*"
    - "log/**/*"
    - "tmp/**/*"
    - "vendor/**/*"
    - "lib/tasks/auto_annotate_models.rake"
    - "config/environments/*"
    - "config/puma.rb"

これは、全てのルール検出への全体的な設定です!
上の「SuggestExtensions: false」「NewCops: enable」「DisplayCopNames: true」はコメント通りの説明です、設定しておきましょう!

Exclude:はRuboCopの検出対象から外すファイルを設定するものです!
自分は、config/配下はRailsがデフォルトで生成したままの記述で問題無いと考えているので、RuboCopの対象から外しました!
その他の対象外ファイルは、明らかに必要無い部分なので設定しておきましょう!

ツキヤ
ツキヤ

tmp/配下とかは明らかに見る必要が無いので、対象外にしてしまってRuboCopの処理を早くしたいね!

その他

25行目以降に書いてあるものは細かいルールを緩くしているものです!
簡単にコメントで書かれているので読みながらカスタマイズしてみて下さい!

繰り返しになりますが、今回のルールはかなり緩めにしてあります!
素のルールだとかえって可読性が悪くなる場合があると僕は思うからです🤔
RuboCopやRubyの書き方に慣れてきたら厳し目のルールにしてみるのも良いかもしれません。

おわりに

今回はRuboCopの説明から、ルール設定についてまで説明しました!
RuboCopを含む、Railsの勉強をしたい方はこの本が参考になるかと思いますので興味がある方は是非読んで見て下さい🙇‍♂️

また、今回は素のRubyファイルに対する静的解析のツールとしてRuboCopを紹介しました。
ですが、実はhtml.erbファイルにもルールを敷くgemがあったりします!
こちらも今後記事にする予定ですので、お楽しみに😎