Rubocopの使い方と導入法について - Hashimoto-Noriaki/rails-rspec-memo GitHub Wiki

2021年7月投稿 2024年に修正

RuboCopとは、

Rubyコードを自動的に解析・整形してくれるツールです

RuboCopのメリット

  • レビューにかかるコスト(時間、労力)を短縮できる
  • コードを統一することができる
  • お手本の記述方法が分かる

RuboCopを使うとコ綺麗なコードを書けるようになります。 リファクタリング力も身につきます。

RuboCop実行コマンド

以下がRuboCopの実行コマンドです。

$ bundle exec rubocop -a     自動修正してくれるコマンド

$ % bundle exec 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

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

引用資料

自分が書いたZennの記事を引用しました。

https://zenn.dev/norihashimo/articles/f857740e484b9d

参考資料

https://techtechmedia.com/rubocop-installation/

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

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

公式ドキュメント

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

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