💨

一撃で理解できる❗️RuboCopの導入法(コード品質向上には必須)

2023/11/15に公開

RuboCopとは何か

Railsを使う現場でよく使われていて、
自分や他のメンバーがコマンド1つでコードを解析してくれる便利なGemです。
「もっとこう書くといいぞ!」とか「こんな書き方はだめだー」とか
色々指摘してコードの品質向上に貢献してくれるめちゃくちゃ便利なツールです。

RuboCopのメリット

1.業務のコードの品質向上
2.自分が書くコードが綺麗になる

この2点は現場では特に大事です。
コードの品質が悪いとバグにつながってしまいますし、汚いコードばかり書いていると
他のメンバーにも迷惑がかかります

こんなメリットしかないRuboCopについて自分が現場でRuboCopの設定をした時について語っていきます。

例えばどんな感じで修正してくれるのか

実務のコードは出せないのでChatGPTに代わりに出してもらいました。

例: Layout/IndentationConsistency

以下が指摘が入ったコードです。

class ExampleClass
    def example_method
  puts "Hello, world!"
    end
end

RuboCopの指摘: "Layout/IndentationConsistency: Inconsistent indentation detected."

RuboCopが自動修正します。

class ExampleClass
  def example_method
    puts "Hello, world!"
  end
end

インデントで指摘があり、RuboCopが適切なインデントに修正しました。

Gemfileに追加してbundle installをする

Gemfileに以下の内容を追記しました。

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

3つのgemをインストールします!。
RuboCopは開発環境でしか使わないのでdevelopmentグループの中に、
毎回requireする必要が無いのでrequire: falseにします。この後に以下を実行します。

bundle install

現場でbundle installする時の注意点

現場でapiのコンテナに入っていない状態でbundle installした後にrubocopを起動したり
したらなんとファイルが5000ファイル以上も変更されてました。

スクリーンショット 2023-11-15 17.58.14.png

dockerの環境にちゃんと入ってからbundle installした方がいいですね汗。

RSpecも導入するなら

RSpecも導入するならGemfileにRSpec関連のGemも追記しておくといいです。

group :development, :test do
  #中略
  gem "factory_bot_rails"
  gem "rspec-rails"
end

RSpecでテストをする際にFactoryBotも入れておくと便利です。

https://qiita.com/Hashimoto-Noriaki/items/4192a570e3263341daaf

https://qiita.com/nichidai3_0514/items/2bc33878dbcedc63725b

後、これだと

bundle exec rubocop

が実行できません。

rubocop

だけのコマンドは実行できます。Gemfileに以下の追記が必要です。

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

bundle exec rubocop --auto-gen-configコマンドを使って初期設定

以下のコマンドで初期設定ができます。

bundle exec rubocop --auto-gen-config

このコマンドが実行後に以下の2つのファイルができます。

.rubocop.yml
.rubocop_todo.yml

今コマンドを打った

bundle exec rubocop --auto-gen-config

今ルール違反のあるファイルや内容をすべて.rubocop_todo.ymlに書け! というコマンドです。

.rubocop.ymlについて

これはルールの設定を細かく設定できるファイルのことです。
まずは以下を追記します。

inherit_from: .rubocop_todo.yml #rubocop_todo.ymlに書いてある内容はルール違反してても無視


require:
  - rubocop-performance #ここはGemfileで設定した部分
  - rubocop-rails
  - rubocop-rspec

.rubocop_todo.yml

先ほどの

$ bundle exec rubocop –auto-gen-config

コマンドでルール違反が起きている内容はここに書いてあります。

参考資料を引用すると

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

細かい解析はChatGPTや以下の記事で調べてください。

https://qiita.com/ota_tsugu/items/5db7ac2a5ac8c90c273b

.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

引用  https://blog.to-ko-s.com/rubocop-setting/#i-4

⚫︎AllCops:
全てのルールへの全体的な設定についてです。

⚫︎Exclude
RuboCopの検出対象から外すファイルです。

.rubocop_todo.yml削除

.rubocop.ymlの設定が終われば.rubocop_todo.ymlを削除しました。

RuboCopを起動

実際にRuboCopを起動します。

bundle exec rubocop

すると
スクリーンショット 2023-11-15 22.13.35.png

みたいな感じになります。
これは51のファイルチェックして220個ルール違反が検出されたということです。

 bundle exec rubocop -a

で自動修正してくれるみたいです。

有益な記事

https://qiita.com/piggydev/items/074e020e07af7ebc872d

参考資料

https://blog.to-ko-s.com/rubocop-setting/#i-4

公式ドキュメント

RuboCopを実行していく上で参考にしてください。

https://www.rubydoc.info/gems/rubocop/RuboCop

Discussion