はじめに
チーム開発ではコードの規約が大切になります。
規約がなかった場合、「僕はインデント幅2が好きだから2にしとくね」「僕はインデント幅100が好きだから100にしとくね」みたいな感じになってコードの可読性が落ちたり、思わぬエラーを引き起こしたりします。
そのような規約を暗黙の了解ではなく、自動的に適用させられたら嬉しいです。
そんな時に役立つのがRuboCop
です。
RuboCopとは
Rubyのリンターです。JavascriptだとESLint
が有名だと思います。
解析するだけでなく、フォーマッターの役割もしてくれます。
セットアップ
Railsに導入するものとします。Gemfile
に以下のgemを追加します(rspecを使わない方は4行目は必要ありません)。
gem 'rubocop', require: false
gem "rubocop-performance", require: false
gem "rubocop-rails", require: false
gem "rubocop-rspec", require: false
RuboCopの設定ファイルを作ります。
touch .rubocop.yml
とりあえず、これで走らせることができるので走らせてみます。
rubocop
おそらく、かなりたくさんの警告が出ると思います。
RuboCopコマンド
自動でフォーマットして欲しい場合は下記のコマンドを実行します。
rubocop -a
警告が出ているものを一旦無視する形で退避する場合は以下のコマンドを実行します。
rubocop --auto-gen-config
実行すると.rubocop_todo.yml
が自動的に生成されます。
.rubocop_todo.yml
では警告の対象になっているものをExcludeする形で退避しています。
ファイルが生成されるのと同時に.rubocop.yml
にはinherit_from: .rubocop_todo.yml
が追加されています。
これによりrubocopの解析範囲は、.rubocop_todo.yml
で退避されていないところかつ、.rubocop.yml
に基づくところになります。
.rubocop.ymlファイルの設定
RuboCopのデフォルト設定は下記のファイルに定義されています。
.rubocop.yml
でオーバーライドすることによって独自の解析ができるようになります。
現在の状態では、rubyの解析しかするようになっていないため下記のようにファイル内でrequire
します。
require:
- rubocop-performance
- rubocop-rspec
- rubocop-rails
何ができるのか
できることが多すぎてよくわかりません。
とりあえず何が原因で警告が出ているのかをみるために、rubocop --auto-gen-config
して、.rubocop_todo.yml
を眺めるのがいいのかなと思います。
なんか良さげなやつ
-
Bundler/OrderedGems:
=> Gemfileを自動でソートしてくれる -
Layout/AccessModifierIndentation
=> privateもしくはpublicメソッド宣言後に定義されたメソッドをインデントする -
Layout/EmptyLines
=> 不必要な改行を削除 -
Layout/EmptyLinesAroundBlockBody:
=> ブロックの最初の不要な空行を削除 -
Layout/EmptyLinesAroundClassBody:
=> クラス定義の最初と最後の不要な空行を削除 -
Layout/EmptyLinesAroundModuleBody:
=> 上記のmoduleバージョン -
Layout/ExtraSpacing:
=> 不必要なスペースを削除 -
Layout/LeadingCommentSpace:
=> コメントアウト時の#
とコメントの間に半角スペースを入れる -
Layout/SpaceAfterColon:
=> 「:」の後に半角スペースを入れるようにする -
Layout/SpaceAroundOperators:
=> 「=」の前後に半角スペース -
Layout/SpaceInsideArrayLiteralBrackets:
=>[ :space ]
を[:space]
のようにする(前後に半角スペースを入れない) -
Layout/SpaceInsideHashLiteralBraces:
=> ↑と逆で{}
の場合、半角スペースを入れる -
Layout/TrailingEmptyLines:
=> 最終行に改行を入れる -
Layout/TrailingWhitespace:
=> コード内の不必要なスペースを削除 -
Style/ClassAndModuleChildren:
=>User::SessionsController
みたいに定義しているところをうまくネストしてくれる -
Style/StringLiterals:
=> シングルクォートに統一
不必要そうなもの(.rubocop.yml)
require:
- rubocop-performance
- rubocop-rspec
- rubocop-rails
inherit_from: .rubocop_todo.yml
# class, moduleの先頭の行に説明文を書く必要性
Style/Documentation:
Enabled: false
# ↑がtrueで先頭の行に何もなかった場合、# frozen_string_literal: trueが先頭の行に追加される
Style/FrozenStringLiteralComment:
Enabled: false
# 1行の長さのリミット
Layout/LineLength:
Enabled: false
# ガード節(条件を満たさない場合は即returnするようにする) => if文の可読性が落ちそう
Style/GuardClause:
Enabled: false
# %i[mri mingw x64_mingw] <= シンボルの配列をこんな感じにしてくる(多分可読性落ちる)
Style/SymbolArray:
Enabled: false
# trueの場合、最後の引数の後にコンマを入れないようにする
Style/TrailingCommaInArguments:
Enabled: false
# インデント幅を変えたい時
# Layout/IndentationWidth:
# Width: インデント幅
参考にしたサイト