---
title: "RuboCopとは？読み方・使い方と-a/-Aの違い、.rubocop.yml設定【1.92で実測】"
url: "https://www.issoh.co.jp/tech/details/3570/"
published: 2024-09-12
updated: 2026-10-28
categories: ["Ruby"]
publisher: "株式会社一創"
---

# RuboCopとは？読み方・使い方と-a/-Aの違い、.rubocop.yml設定【1.92で実測】

RuboCop（ルボコップ）とは、Rubyのコードを実行せずに読み、スタイルガイドへの違反やバグの芽を指摘して、多くを自動で直す静的コード解析ツール兼フォーマッタです。名前はRubyとCop（警官）を合わせたものです。2026年10月28日時点の最新版は[RubyGemsの配布ページ](https://rubygems.org/gems/rubocop)で1.92.1（2026年10月22日公開）、ライセンスはMITです。この記事では1.92.1をRuby 4.0.6上で実際に動かし、出力の読み方、`-a`と`-A`で直る範囲の違い、`.rubocop.yml`の設定、Rails 8に標準で入るrubocop-rails-omakaseとの差を実測値で示します。静的解析という手法そのものは[静的解析とは？検出できる欠陥と静的解析ツールの選び方](/tech/details/7475/)で整理しています。

## まとめ：RuboCopの要点

- **正体**：Ruby専用のLinter兼フォーマッタ。読み方は「ルボコップ」。1.92.1には613個の検査ルール（cop）があり、既定で有効なのは394個。
- **最初の一手**：`.ruby-version`か`TargetRubyVersion`を置いてから実行する。対象のRubyを示すファイルが1つも無いと既定値の「Ruby 2.7として解析」になる。
- **自動修正**：`-a`は安全と判定された修正だけ、`-A`は意味が変わりうる修正も適用する。同じ10行のコードで`-a`は4件、`-A`は7件直した。
- **既存コード**：`--auto-gen-config`で今の違反を`.rubocop_todo.yml`へ退避し、新しいコードから規約を効かせる。
- **Rails 7.2以降**：標準のrubocop-rails-omakaseは43個のcopしか有効にしない。同じコードで素のRuboCopの6件が0件になるので、バグの芽を拾いたいなら`Lint`を足す。

## RuboCopの役割：Linterとフォーマッタの兼用

RuboCopは、コミュニティが管理する[Rubyスタイルガイド](https://rubystyle.guide/)を既定の規約として、命名・インデント・書き方・複雑さ・危険な書き方を検査します。Linterとして違反を報告するだけでなく、インデントや引用符のような機械的に直せるものはその場で書き換えます。

動作に必要なRubyは2.7.0以上ですが、解析対象のコードはRuby 2.0以降を指定できます（[公式の互換性ページ](https://docs.rubocop.org/rubocop/latest/compatibility.html)）。

### copと部門（department）：1.92.1の613個の内訳

検査ルール1つ1つを「cop」と呼び、`Layout/LineLength`のように「部門/名前」で表します。1.92.1で`rubocop --show-cops`を実行して数えた部門ごとの内訳が次の表です。

| 部門        | cop数 | 見ているもの                  |
| --------- | ---- | ----------------------- |
| Style     | 299  | 書き方の流儀（引用符・条件式など）       |
| Lint      | 160  | バグの芽（未使用の代入・曖昧な式）       |
| Layout    | 100  | インデント・空白・行長             |
| Naming    | 19   | 変数・メソッド・ファイルの命名         |
| Metrics   | 10   | メソッド長・クラス長・複雑度          |
| Gemspec   | 10   | gemspecの書き方             |
| Security  | 7    | evalやJSON.loadなど危険な呼び出し |
| Bundler   | 7    | Gemfileの書き方             |
| Migration | 1    | cop名の移行                 |

613個のうち既定で有効（Enabled: true）は394個、新しく追加されて有効化を保留している「pending」が163個、既定で無効が56個です（[公式のcop一覧](https://rubocop.org/cops/)も「613 in RuboCop 1.92.1」）。`Metrics`の閾値は設計の議論にも使われ、たとえば`Metrics/ClassLength`の既定は1クラス100行です。この数字をモデル分割の目安に使う考え方は[RailsのFat Model対策｜1500行model.rbを分割する4手法と判断基準](/tech/details/12933/)で扱っています。

## RuboCopをインストールして最初の検査を動かす

Bundlerを使うプロジェクトでは、Gemfileの開発・テスト用グループに追加します。`require: false`は、アプリの起動時にRuboCopを読み込まないための指定です。

```
# Gemfile
group :development, :test do
  gem "rubocop", require: false
end
```

`bundle install`のあと、`bundle exec rubocop`でプロジェクト全体を、`bundle exec rubocop app/models`のようにパスを渡せばその範囲だけを検査します。チームで使うならGemfile.lockで版を固定し、全員とCIで同じ結果になるようにします。gemの追加と版の固定の仕組みは[gemとBundlerの使い方｜Bundler 4系で変わったコマンドとGemfileの書き方](/tech/details/4221/)にまとめています。

### 実行結果の読み方：C・W・\[Correctable\]の意味

次の10行を`sample.rb`として検査しました（`.rubocop.yml`で`TargetRubyVersion: 4.0`と`NewCops: enable`を指定）。

```
class Greeter
  def initialize(name)
    @name=name
  end

  def greet
    unused = 1
    puts "Hello, " + @name
  end
end
```

```
sample.rb:3:10: C: [Correctable] Layout/SpaceAroundOperators: Surrounding space missing for operator =.
sample.rb:7:5: W: [Correctable] Lint/UselessAssignment: Useless assignment to variable - unused.
sample.rb:8:10: C: [Correctable] Style/StringConcatenation: Prefer string interpolation to string concatenation.

1 file inspected, 6 offenses detected, 5 offenses autocorrectable
```

1行が1件の違反で、「ファイル:行:列: 重大度: cop名: 説明」の順に並びます。重大度は低い順にinfo・refactor・convention（`C`）・warning（`W`）・error（`E`）・fatal（`F`）の6段階で、既定値は部門ごとに決まります（[公式のcop設定の解説](https://docs.rubocop.org/rubocop/latest/configuration/cop%5Fsettings.html)）。この例では`Lint`の違反が`W`、ほかが`C`でした。`[Correctable]`は自動修正できる違反の印です。既定では、自動修正されずに残った違反が1件でもあると終了コードが1になり、CIはこれで失敗を判定します（閾値は`--fail-level`で変えられます）。

### 対象Rubyの手がかりが無いときのRuby 2.7扱い

`.rubocop.yml`も`.ruby-version`もGemfile.lockも無いディレクトリで`rubocop -V`を実行すると、Ruby 4.0.6の上で動かしていても`analyzing as Ruby 2.7`と表示されました。[公式の設定の解説](https://docs.rubocop.org/rubocop/latest/configuration.html)によると、`TargetRubyVersion`が無いときは`*.gemspec`・`.ruby-version`・`mise.toml`・`.tool-versions`・Gemfile.lockの順に対象のRubyを探し、どれにも無ければソースの既定値（`DEFAULT_VERSION = 2.7`）を使います。さらにpendingのcopの「設定してください」という警告が160行以上並び、違反が埋もれます。

`.ruby-version`（`4.0.6`など）を置くと`analyzing as Ruby 4.0`に切り替わり、pendingの警告は`NewCops: enable`で消えます。Rubyの現行版とサポート期限は[Rubyの最新バージョンは4.0.7｜4.1.0-preview1の変更点・3系との違い・サポート期限](/tech/details/10592/)で確認できます。

## 自動修正の-aと-Aの違い：同じコードでの比較

`-a`は`--autocorrect`、`-A`は`--autocorrect-all`の短縮形です。[公式の自動修正の解説](https://docs.rubocop.org/rubocop/latest/usage/autocorrect.html)では、copごとに`Safe`（設計上、誤検出が起こりうるか）と`SafeAutoCorrect`（修正がコードの意味を保つか）の2つの属性があり、`-a`は両方が真のcopの修正だけを当てます。上のsample.rbに両方を実行した結果がこの表です。

| 違反（cop）                               | \-a | \-A |
| ------------------------------------- | --- | --- |
| Layout/SpaceAroundOperators           | 修正  | 修正  |
| Style/StringLiterals                  | 修正  | 修正  |
| Lint/UselessAssignment                | 修正  | 修正  |
| Lint/Void（連鎖）                         | 修正  | 修正  |
| Style/StringConcatenation             | 残る  | 修正  |
| Style/FrozenStringLiteralComment      | 残る  | 修正  |
| Layout/EmptyLineAfterMagicComment（連鎖） | –   | 修正  |
| Style/Documentation                   | 残る  | 残る  |

「連鎖」は、1つ直した結果として新しく出た違反です。`unused = 1`の代入を消すと`1`だけが残って`Lint/Void`になり、`-A`が足したマジックコメントの後に空行が無いと`Layout/EmptyLineAfterMagicComment`になります。RuboCopはこうした連鎖も同じ実行の中で直します。`-a`の結果は「4 offenses corrected, 2 more offenses can be corrected with `rubocop -A`」でした。`-A`だけが当てた2件が危ない理由は、`--explain`で確かめられます。`Style/StringConcatenation`は「受け手が本当に文字列か保証できない」、`Style/FrozenStringLiteralComment`は「マジックコメントを足すと文字列がすべて凍結され、文字列を書き換えている箇所が`FrozenError`になる」と説明されます。`-A`の後はテストを通し、差分を読んでからコミットしてください。`Style/Documentation`（クラスの説明コメント）は人が書くしかありません。

```
bundle exec rubocop --explain Style/FrozenStringLiteralComment
```

`--explain`は1.92.0で入ったオプションで、copの説明・`Safe`の値・`-a`と`-A`のどちらで直るかを端末に出します。旧表記の`--auto-correct`は1.30.0で非推奨になり、`--autocorrect`へ置き換わりました。

## .rubocop.ymlでルールを調整する

設定はプロジェクト直下の`.rubocop.yml`に書きます。全体の設定は`AllCops`、個別のcopは名前をキーにします。`rubocop --init`で空の雛形を作れます。

```
# .rubocop.yml
AllCops:
  TargetRubyVersion: 4.0
  NewCops: enable
  Exclude:
    - "db/schema.rb"
    - "vendor/**/*"

Layout/LineLength:
  Max: 100

Style/Documentation:
  Enabled: false
```

`Layout/LineLength`の既定は120文字です（0.84.0で80から120へ変更）。`Max: 120`と書いても何も変わらないので、書くのは既定から変えたいときだけです。古い記事にある`Metrics/LineLength`は部門を移った旧名です。

`TargetRubyVersion`を3.4以上にすると、1.75以降は構文解析にRuby本体と同じPrismを使う`parser_prism`が既定になります（[互換性ページ](https://docs.rubocop.org/rubocop/latest/compatibility.html)）。Ruby 3.3以下を対象にした場合は従来のparser gemが既定です。

### コメントによる部分的な無効化とdisable-next（1.90以降）

特定の行だけ検査を止めるには、行末に`# rubocop:disable Style/StringConcatenation`を書きます。次の1文だけ止めたいときは、1.90.0で入った`disable-next`が使えます。

```
# rubocop:disable-next Style/StringConcatenation
puts 'Hello, ' + name
```

ESLintの癖で`disable-next-line`と書くと、RuboCopでは`Lint/CopDirectiveSyntax`の「Malformed directive comment」になり、止めたかった違反も残ります。1.90で入った`Style/DirectiveScope`は、1文だけを`disable`と`enable`で挟む書き方を指摘します。

## 既存プロジェクトへの後付け：.rubocop\_todo.ymlで段階導入

規模のあるコードに後から入れると初回に数百〜数千件の違反が出て、一度に直すとレビューできない差分になります。[公式の手順](https://docs.rubocop.org/rubocop/latest/usage/auto%5Fgen%5Fconfig.html)どおり、まず今の違反を記録して黙らせ、新しいコードから規約を効かせます。

```
bundle exec rubocop --auto-gen-config
```

sample.rbで実行すると`.rubocop_todo.yml`が作られ、`.rubocop.yml`の先頭に`inherit_from: .rubocop_todo.yml`が足され、再実行の結果は「no offenses detected」になりました。生成内容は「このcopはこのファイルを除外」という形です。

```
Lint/UselessAssignment:
  Exclude:
    - 'sample.rb'

Style/StringLiterals:
  EnforcedStyle: double_quotes
```

注意点が2つあります。1つ目は、`Style/StringLiterals`のように流儀を選べるcopでは、ファイルを除外するのではなく既存コードの流儀（ここでは二重引用符）に設定が書き換わることです。チームの規約と違う流儀が固定されていないか、生成直後に読んでください。2つ目は、違反ファイルが`--exclude-limit`の上限（既定15）を超えたcopは`Enabled: false`で丸ごと止まることです。新しいコードでも検査されなくなるため、大きなプロジェクトでは`--no-exclude-limit`を付けてファイル単位の除外にとどめます。

その後は`.rubocop_todo.yml`からcopを1つずつ消し、`-a`で直してレビューする、を繰り返します。`Layout`と`Style`の`-a`で直るものから始めると、意味を保つと判定された修正なのでレビューの負担が比較的軽く済みます。それでもテストは毎回通します。

## Rails標準のrubocop-rails-omakaseと素のRuboCopの検査範囲の差

Rails 7.2以降の`rails new`は、[Gemfileの雛形](https://github.com/rails/rails/blob/v8.0.0/railties/lib/rails/generators/rails/app/templates/Gemfile.tt)に`rubocop-rails-omakase`を入れ、`.rubocop.yml`を`inherit_gem: { rubocop-rails-omakase: rubocop.yml }`の1行で生成します（`--skip-rubocop`で外せます）。

omakase 1.1.0の設定ファイルを読むと、まず全部門を`Enabled: false`にし、そのうえで43個のcopだけを有効にしています。内訳は`Layout`27個・`Style`12個・`Lint`3個・`Performance`1個です。前述のsample.rbをomakaseの設定で検査した結果がこの表です。

| 設定                          | 違反 | 未使用の代入 |
| --------------------------- | -- | ------ |
| 素のRuboCop（NewCops: enable）  | 6件 | 検出     |
| rubocop-rails-omakase       | 0件 | 見逃す    |
| omakase＋Lint: Enabled: true | 1件 | 検出     |

omakaseの有効copは大半が`Layout`と`Style`で、この例の未使用の代入（`Lint/UselessAssignment`）は検出されませんでした。`Rails`部門もプラグインは読み込むものの部門ごと無効です。判断はこうです。DHHの流儀の書式で揃えば十分なチームはomakaseのままでよいです。レビューで機械に拾わせたいのがバグの芽なら、omakaseを継承したうえで`Lint`部門を有効にします。Railsらしい書き方まで強制したいなら、omakaseをやめて素のRuboCopとrubocop-railsの組み合わせに切り替えます。`Lint`を足すとpendingの警告が再び出るので、`NewCops`も決めておきます。

```
# .rubocop.yml（omakaseにバグの芽の検出を足す）
inherit_gem:
  rubocop-rails-omakase: rubocop.yml

AllCops:
  NewCops: enable

Lint:
  Enabled: true
```

## プラグインでRails・RSpec・性能の規約を足す

Rails・RSpec・性能の規約は別gemのプラグインが担います。1.72でプラグイン機構が入り、設定は`plugins:`キーで読み込みます（[公式の移行ガイド](https://docs.rubocop.org/rubocop/latest/plugin%5Fmigration%5Fguide.html)）。

```
# Gemfile
gem "rubocop-rails", require: false
gem "rubocop-rspec", require: false
gem "rubocop-performance", require: false
```

```
# .rubocop.yml
plugins:
  - rubocop-rails
  - rubocop-rspec
  - rubocop-performance
```

| プラグイン               | 対象        | plugins:対応 | 最新版    |
| ------------------- | --------- | ---------- | ------ |
| rubocop-rails       | Railsの書き方 | 2.30.0〜    | 2.38.0 |
| rubocop-rspec       | RSpecのテスト | 3.5.0〜     | 3.10.2 |
| rubocop-performance | 遅い書き方     | 1.24.0〜    | 1.27.0 |

最新版は2026年10月28日にRubyGemsで確認した値です。古い書き方の`require:`キーにrubocop-railsを並べても動きますが、1.92.1では「rubocop-rails extension supports plugin, specify `plugins: rubocop-rails` instead」という警告が出ました。`plugins:`に対応した版のプラグインなら書き換えておきます。

## エディタ・CI・AIエージェントからRuboCopを動かす

### サーバーモードによる起動待ちの短縮

RuboCopは起動のたびに設定とプラグインを読み込みます。1.31で入った[サーバーモード](https://docs.rubocop.org/rubocop/latest/usage/server.html)は常駐プロセスに検査を任せます。rubocop-railsとrubocop-performanceを読み込んだ状態でsample.rb 1ファイルを検査すると、通常実行は3回とも13秒台、`--server`は1回目こそ13.1秒でしたが2回目以降は1.4〜2.0秒でした（キャッシュを切る`--cache false`で計測・Intel Core i9-9880H。絶対値はマシンの負荷で変わります）。サーバーを起動していても、`--server`を付けないか環境変数`RUBOCOP_OPTS`に入れない限り、通常のコマンドはサーバーを使いません。

```
bundle exec rubocop --start-server
bundle exec rubocop --server app/models
bundle exec rubocop --stop-server
```

### エディタ連携：組み込みLSPとRuby LSP

1.53からRuboCop自身がLanguage Serverとして動き、`bundle exec rubocop --lsp`をエディタのLSPクライアントから起動すると、入力中に違反が表示され、保存時に整形できます（[公式のLSPの解説](https://docs.rubocop.org/rubocop/latest/usage/lsp.html)）。VS CodeではShopifyのRuby LSP拡張がGemfileにあるRuboCopを自動で使うので、個別の設定はほぼ要りません。拡張の入れ方と整形の設定は[ruby on rails を vscode で開発する環境構築【2026年版】Ruby LSP・デバッグ・Dev Container](/tech/details/2878/)で手順にしています。

### GitHub Actionsでのプルリクエスト検査

プッシュとプルリクエストのたびに検査し、違反があればジョブを失敗させます。[ruby/setup-ruby](https://github.com/ruby/setup-ruby)は`ruby-version`を省くと`.ruby-version`を読み、`bundler-cache: true`で`bundle install`とgemのキャッシュまで行います。actions/checkoutの現行メジャー版はv7（v7.0.1が2026年7月20日公開）です。

```
# .github/workflows/rubocop.yml
name: RuboCop
on: [push, pull_request]
jobs:
  rubocop:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v7
      - uses: ruby/setup-ruby@v1
        with:
          bundler-cache: true
      - run: bundle exec rubocop --format github
```

`--format github`を付けると、違反がプルリクエストの差分の該当行に注釈として表示されます。ワークフローが失敗するだけではマージは止まらないので、ブランチ保護（またはルールセット）でこのジョブを必須のステータスチェックに指定します。CodeRabbitもRuboCopを内部で走らせられるので、CIとの分担は[CodeRabbitの導入手順と.coderabbit.yaml設定・料金と分担の決め方](/tech/details/17349/)を参考に決めます。

### MCPサーバー：AIエージェントからの検査と修正

1.85で実験的機能として入った`rubocop --mcp`は、検査（rubocop\_inspection）と自動修正（rubocop\_autocorrection）をAIエージェントのツールとして公開します。[公式のMCPの解説](https://docs.rubocop.org/rubocop/latest/usage/mcp.html)のとおり`mcp` gemは依存に含まれないので別途Gemfileに足します。実験的機能なので、CIの判定には通常のコマンドを使います。

## Standard Ruby・Brakemanとの使い分け

Standard Rubyとomakaseは「RuboCopの規約をどう決めるか」の選択肢で、どちらか1つを選びます。Brakemanは守備範囲が違うので併用します。

| ツール                   | 中身          | 設定の自由度   | 向く場面        |
| --------------------- | ----------- | -------- | ----------- |
| RuboCop               | 本体（613cop）  | cop単位で全部 | 自分たちの規約を作る  |
| Standard Ruby         | RuboCopが基盤  | 原則変えない   | 規約の議論をやめたい  |
| rubocop-rails-omakase | RuboCopの設定集 | 上書き可     | Railsの既定に乗る |
| Brakeman              | 別エンジン       | 検査の選択・除外 | Railsの脆弱性検出 |

[Standard Ruby](https://github.com/standardrb/standard)（最新は1.57.0）はRuboCopを基盤にしたLinter兼フォーマッタで、規約を設定させないことで議論を省きます。規約を自分たちで決めたいならRuboCop、決めたくないならStandardです。ただし[RubyGems](https://rubygems.org/gems/standard)の依存情報ではStandard 1.57.0がRuboCopを`~> 1.91.0`に固定しているため、同じGemfileでRuboCop 1.92系を指定すると依存が解決できません。どちらもSQLインジェクションのような脆弱性は見ないため、RailsアプリならBrakemanを並べます。静的解析が見つけられるバグとテストでしか見つからないバグの境目は、[静的テストと動的テストの違い｜静的解析・動的解析で見つかるバグを同じコードで比較](/tech/details/5254/)で同じコードを使って比べています。

## よくある質問

### RuboCopの読み方は？

「ルボコップ」です。Ruby＋Cop（警官）を合わせた名前です。映画のRoboCop（ロボコップ）とは綴りが違います。

### rubocop -a と -A の違いは？

`-a`は意味を保つと判定された修正だけ、`-A`は意味が変わりうる修正も当てます。10行の例では`-a`が4件、`-A`が7件直しました。

### RuboCopの最新バージョンは？

2026年10月28日時点で1.92.1（2026年10月22日公開）です。2026年は1.91.0が9月10日、1.92.0が10月10日と1か月前後でマイナー版が出ています。[公式の版の方針](https://docs.rubocop.org/rubocop/latest/versioning.html)では、新しいcopはマイナー版でpendingとして足され、既定で有効にするのはメジャー版です。

### RailsにはRuboCopが最初から入っている？

Rails 7.2以降の`rails new`ではrubocop-rails-omakaseが入り、RuboCop本体もその依存として入ります。ただし有効なcopは43個だけです。

### RuboCopは無料で使える？

無料です。MITライセンスで、商用プロジェクトでも使えます。rubocop-rails・rubocop-rspec・rubocop-performanceもMITです。

## 関連記事

- [静的解析とは？検出できる欠陥と静的解析ツールの選び方｜Coverity・cppcheckを比較](/tech/details/7475/)
- [ruby on rails を vscode で開発する環境構築【2026年版】Ruby LSP・デバッグ・Dev Container](/tech/details/2878/)
- [Rubyの最新バージョンは4.0.7｜4.1.0-preview1の変更点・3系との違い・サポート期限（2026年10月）](/tech/details/10592/)
- [gemとBundlerの使い方｜Bundler 4系で変わったコマンドとGemfileの書き方](/tech/details/4221/)
- [RailsのFat Model対策｜1500行model.rbを分割する4手法と判断基準](/tech/details/12933/)

---

出典: [RuboCopとは？読み方・使い方と-a/-Aの違い、.rubocop.yml設定【1.92で実測】](<https://www.issoh.co.jp/tech/details/3570/>)（株式会社一創）
