RuboCop使ってみた


はじめに

RuboCopを初めて触ってみたので、備忘のために導入から使用方法まで大まかに記載します。
これから本格的に使っていくので、もし間違いなどがあれば教えていただけると幸いです。

RuboCopとは

コーディング規約に沿って、コーディングできているかを確認できる「静的コード解析ツール」。

つまり、自分のコードが規約に沿って書かれているかをチェックするためのツール。

複数人開発の際にはもちろん、個人開発の場合でも綺麗なコードを書き、品質を維持することに越したことはないので、使ってみて損はない。

インストール

RuboCopはgemを使って簡単にインストールできる。
Gemfileに以下を記載。

Gemfile

gem 'rubocop', require: false
gem 'rubocop-rails'

そしてお決まりの下記コマンド。

$bundle install

これでOK。

使い方

ターミナルでrubocopコマンドを実行するだけ。


$ rubocop
Inspecting 58 files
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC

.
.

58 files inspected, 199 offenses detected

その結果出た警告を修正してまたrubocopコマンドを実行するような流れ。

ただデフォルトの設定だとRuboCopのコーディング規約は厳しいので、相当な数の警告がでる。
そこで、RuboCopのルールを自分なり(もしくはチームなり)に作成することで、実際は使う。

まずは以下のコマンドを用いて、
.rubocop.yml
.rubocop_todo.yml
を作成する。

$ rubocop --auto-gen-config

このコマンドによって作成された上記の2つのファイルの役割は、

.rubocop.yml ・・・ 自分なり(チームなり)のコーディングルールを定めるファイル
.rubocop_todo.yml ・・・無視するルールを定めるファイル

である。

.rubocop.ymlを巷で見つけた以下の設定に変更。
併せて.rubocop_todo.ymlも空にしておく。

.rubocop.yml
inherit_from: .rubocop_todo.yml

# 追加した規約ファイル読込
require:
  - rubocop-rails

AllCops:
  # Rubyバージョン指定
  TargetRubyVersion: 2.6
  # 除外
  Exclude:
    - "config.ru"
    - "bin/**"
    - "lib/**"
    - "db/**/*"
    - "config/**/*"
    - "script/**/*"
    - !ruby/regexp /old_and_unused\.rb$/

# 日本語でのコメントを許可
AsciiComments:
  Enabled: false

# クラスのコメント必須を無視
Documentation:
  Enabled: false

# モジュール名::クラス名の定義を許可
ClassAndModuleChildren:
  Enabled: false

# 文字リテラルのイミュータブル宣言を無視(freezeになるのはRuby3以降)
Style/FrozenStringLiteralComment:
  Enabled: false

この上でrubocopコマンドを実行すると、先程よりだいぶ数が減っているはずである。

$rubocop --auto-correct

ただ俄然数は多いので、そういった場合には$rubocop --auto-correctのコマンドで、rubocopが自動修正をしてくれる。

$ rubocop --auto-correct
Inspecting 19 files
CC..............C.C

Offenses:

spec/spec_helper.rb:93:1: C: [Corrected] Layout/CommentIndentation: Incorrect indentation detected (column 0 instead of 2).
#   Kernel.srand config.seed
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.
.

56 files inspected, 30 offenses detected, 15 offenses corrected

ここで、[corrected]と出ているところが、自動修正してくれたところである。
今回のケースで言えば、15箇所の自動修正をしてくれたということである。

あとは、残っているcopを確認し、修正するか、もしくは無視するかを決め、対応を行う。
そして再度rubocopコマンドを実行する。といったような流れである。

ある箇所のみ警告を無視するか、もしくは警告自体を出ないようにするか対応を取ることができる。

警告を無視する

こちらでまとめていただいているのが少し古いが参考になった。
RuboCopの警告をコメントで無効化する方法

警告自体を出ないようにする

例えば、以下のような警告が出た場合を考える。


script/rails:4:53: C: Layout/ExtraSpacing: Unnecessary spacing detected.
APP_PATH = File.expand_path('../config/application',  __dir__)

余分なスペースが入っているという警告であるが、面倒であるので、無視しようという方針になれば、それを.rubocop.ymlに記載する。

.rubocop.yml
Layout/ExtraSpacing:
  Enabled: false

そうすると、以後これに関する警告は出なくなる。

$rubocop -D --only cop名

このコマンドにより、該当のcop名のみの警告を抽出できる。

ついでに

rubocopを実行するとたくさん出てくるCとかWとかは何だろうと思い調べてみると、警告の重さであることがわかった。
軽い順に、Refactor, Convention, Warning, Error, Fatalがあり、その頭文字が記載されている。

こういうこともなんとなくではなく、1つ1つ意味を理解しながら学習していきたい。

これから本格的にRuboCopと触れ合うと思うので、より便利な手法を学び、実務で活かしていきたい。

参考にさせていただいたもの

RuboCop公式
Rubocopを使ってRailsコードをチェックしてみる
RuboCopの警告をコメントで無効化する方法