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ファイル以上も変更されてました。
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
⚫︎AllCops: 全てのルールへの全体的な設定についてです。
⚫︎Exclude RuboCopの検出対象から外すファイルです。
.rubocop_todo.yml削除
.rubocop.ymlの設定が終われば.rubocop_todo.ymlを削除しました。
RuboCopを起動
実際にRuboCopを起動します。
bundle exec rubocop
すると
みたいな感じになります。 これは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を実行していく上で参考にしてください。