LoginSignup
2
0

More than 1 year has passed since last update.

はじめに

チーム開発ではコードの規約が大切になります。

規約がなかった場合、「僕はインデント幅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します。

.rubocop.yml
    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)

.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: インデント幅

参考にしたサイト

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0