👨‍✈️

Rubocopという便利な監視人

2024/05/25に公開

今回は、Rubocopを使用したので、Rubocopについて書きたいと思います。

Rubocopとは

ソースコードを解析を実装してくれるツールで、このコードに空白がないよ。とか、ここのコードが長いね。とか、ここのインデントがおかしいね。とかをチェックしてターミナルで教えてくれます。
Rubocopの指摘に従い、コードを修正することにより、クリーンなコードにすることができます。

導入方法

インストール

今回複数のrubocop関連のgemを導入を行いました。

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

上記の4つのgemをインストールしました。
Rubocopは、開発環境でのみ使用するので、developmentグループ内に入れています。
今回導入したrubocopがRubocop本体で、他の3つは追加のルールを設定するために入れます。
特に、rubocop-railsはRailsに対するルール設定を追加できるので入れています。

bundle installコマンドを実行してgemをインストールします。

初期設定

現在のRubocopは厳しすぎるとのことで、設定を行います。
.rubocop.ymlファイルを作成して設定を書いていきます。

参考

https://blog.to-ko-s.com/rubocop-setting/#i-9
https://zenn.dev/minedia/articles/a88546e4efa1f3#設定
私の場合、設定ファイルを作成して、設定を書いていたのですが、調べるとコマンド1つで初期設定を行ってくれるみたいです。

ターミナル
$ bundle exec rubocop --auto-gen-config

このコマンドで2つのファイルが作成されます。

  • .rubocop.yml
  • .rubocop_todo.yml

.rubocop_todo.yml

ソースコードの解析結果のルール違反を無視したい内容を保存するファイルです。この中にある項目は、次回からコードチェック時にチェックの対象外になります。
bundle exec rubocop --auto-gen-configコマンドを実行することで、現在起こっているルール違反の内容がすべてこのファイルに書き込まれます。
このファイルに書き込まれたルール違反を少しずつ修正していくこともできるみたいです。

Rubocop実行

設定まで完了したら、Rubocopを実行してソースコードがルール違反していないか、解析してもらいます。

ターミナル
$ bundle exec rubucop

問題がなければ下記のような表示がされます。
Image from Gyazo

問題があれば下記のように表示されます。

Inspecting 13 files
CC.....C.CCCC

Offenses:

Gemfile:1:8: C: [Correctable] Style/StringLiterals: Prefer single-quoted strings when you don't need string interpolation or special symbols.
source "https://rubygems.org"
       ^^^^^^^^^^^^^^^^^^^^^^
# 中略
13 files inspected, 37 offenses detected, 37 offenses autocorrectable

このようにルール違反内容とその数が表示されます。
違反内容を解説します。

  • Gemfile:1:8:
    修正が望ましいファイル名とその行
  • C:
    違反レベルを表示
    重要なものから順にFFatal・EError・WWarning・CConvention・RRefactorとなっています。
    F~Wは修正しないとバグに繋がる危険性が高いものになるので早めに修正しましょう。
  • [Correctable]
    自動修正が可能かどうか
  • Style/StringLiterals:
    指摘の種類 : 今回の指摘は、コードスタイルに関する指摘
  • Prefer single-quoted strings when you don't need string interpolation or special symbols.
    指摘対象となった理由と改善内容 : 今回の指摘では、文字列を囲うには"よりも'を使うべきという指摘
  • 37 offenses detected
    指摘の数 : 今回の場合は、37箇所の指摘を受けてます。
  • 37 offenses autocorrectable
    指摘のうち自動修正が可能な数 : 今回の場合は、37箇所の自動修正が可能

今回の場合、すべて自動修正を行ってくれるルール違反だったので、下記コマンドを実行して修正を行ってもらいます。

ターミナル
$ bundle exec rubocop -a

オプションに-aをつけることで、自動修正してくれます。結果は下記のようになりました。

ターミナル
Inspecting 13 files
CC.....C.CCCC

Offenses:

Gemfile:1:8: C: [Corrected] Style/StringLiterals: Prefer single-quoted strings when you don't need string interpolation or special symbols.
source "https://rubygems.org"
       ^^^^^^^^^^^^^^^^^^^^^^
# 中略
13 files inspected, 40 offenses detected, 40 offenses corrected

最後の40 offenses detected, 40 offenses correctedですべて修正されたことがわかります。
数字が37から40に増えているのは、修正途中に他のルール違反があり、それも一緒に修正したので増えています。

その後、もう1度bundle exec rubocopで確認してみると

Inspecting 13 files
.............

13 files inspected, no offenses detected

無事、完了しました。

最後に

今回Rubocopについて学んだことを自分のアウトプットとして初心者なりに書いてみました。
Rubocopを使用してクリーンなコードを書けるように頑張りたいです。

Discussion