VSCodeでRuby LSPを使う方法

採用はこちら

VSCodeでRubyを効率よく開発したい場合は、Ruby LSPを導入する方法がおすすめです。

Ruby LSPを使うことで、コード補完や定義ジャンプ、エラー表示、フォーマット、テスト実行、デバッグなど、Ruby開発に必要な機能をVSCode上で利用しやすくなります。

現在は、Shopifyが開発している「Ruby LSP」拡張機能がVSCode向けRuby開発環境の有力な選択肢です。

この記事では、Ruby LSPの基本からインストール方法、設定方法、Railsでの使い方、トラブルシューティングまで詳しく解説します。

目次

Ruby LSPとは

Ruby LSPとは、Ruby向けにLanguage Server Protocolを実装した言語サーバーです。

Language Server Protocolは、VSCodeなどのエディターとプログラミング言語用の解析サーバーとの通信方法を共通化する仕組みです。

Ruby LSPがRubyコードを解析し、その結果をVSCodeへ返すことで、Ruby専用の高度な開発機能を利用できます。

Ruby LSPで利用できる主な機能

Ruby LSPでは、主に以下のような機能を利用できます。

  • コード補完
  • 定義へ移動
  • Hoverによる情報表示
  • シンボル検索
  • ドキュメントアウトライン
  • セマンティックハイライト
  • Diagnosticsによるエラーや警告の表示
  • コードフォーマット
  • コードアクション
  • リファクタリング
  • テスト実行
  • テストデバッグ
  • Rubyプログラムのデバッグ
  • Rails Generatorの実行

単なるコード補完用拡張機能ではなく、VSCodeでRubyを開発するための総合的な開発環境として利用できるのが特徴です。

Ruby LSPを使うための事前準備

Ruby LSPを利用する前に、Rubyの開発環境を準備しておきます。

Rubyがインストールされているか確認する

まずはターミナルで以下のコマンドを実行します。

ruby -v

Rubyのバージョンが表示されれば、Ruby自体は利用可能です。

例えば、以下のように表示されます。

ruby 3.x.x

Rubyが見つからない場合は、先にRubyをインストールする必要があります。

Rubyのバージョンマネージャーを利用する

複数のRubyプロジェクトを扱う場合は、Rubyのバージョンマネージャーを利用すると管理しやすくなります。

代表的なものには、以下があります。

  • rbenv
  • mise
  • asdf
  • chruby
  • rvm

ただし、利用しやすいツールはOSによって異なります。

macOSやLinuxではrbenv、mise、asdfなどがよく利用されます。

WindowsではRubyInstallerを直接利用したり、WSL上でRuby環境を構築したり、miseなどを利用したりする方法があります。

Bundlerを確認する

Gemfileを利用するRubyプロジェクトでは、Bundlerも重要です。

以下のコマンドで確認できます。

bundle -v

バージョン情報が表示されれば問題ありません。

Gemfileが存在するプロジェクトでは、基本的に以下も実行しておきます。

bundle install

これにより、プロジェクトで必要なGemがインストールされます。

なお、単純なRubyスクリプトなど、Gemfileを使用しない環境では必ずしもbundle installが必要とは限りません。

VSCodeにRuby LSPをインストールする

Ruby環境を準備したら、VSCodeにRuby LSP拡張機能をインストールします。

拡張機能画面を開く

VSCode左側の拡張機能アイコンをクリックします。

ショートカットでも開けます。

Windows・Linuxでは以下です。

Ctrl + Shift + X

macOSでは以下です。

Cmd + Shift + X

Ruby LSPを検索する

検索欄に以下を入力します。

Ruby LSP

Shopifyが公開している「Ruby LSP」を選択してインストールします。

拡張機能IDは以下です。

Shopify.ruby-lsp

類似したRuby関連拡張機能も存在するため、PublisherがShopifyであることを確認すると安心です。

参考サイト

Shopify製Ruby LSPを導入し開発環境を改善する[VS Code]

RubyプロジェクトをVSCodeで開く

Ruby LSPを利用するときは、Rubyファイルを単独で開くよりも、プロジェクトのルートディレクトリをVSCodeで開くのがおすすめです。

例えば、以下のような構成があります。

my_app/
├── Gemfile
├── Gemfile.lock
├── app/
├── lib/
└── test/

この場合は、my_appディレクトリそのものをVSCodeで開きます。

ターミナルからプロジェクトを開く

ターミナルから以下のように起動できます。

cd my_app
code .

Ruby LSPはGemfileやGem、Rubyバージョンなどの情報を利用するため、プロジェクトルートを正しく開くことが重要です。

Ruby LSPを起動する

通常はRubyファイルを開くとRuby LSPが自動的に起動します。

例えば、以下のような.rbファイルを開きます。

class User
  def hello
    puts "Hello"
  end
end

正常に動作していれば、コード補完や定義ジャンプなどが利用できるようになります。

Ruby LSPを手動で再起動する

Ruby LSPが正常に動作しない場合は、コマンドパレットを開きます。

Windows・Linuxでは以下です。

Ctrl + Shift + P

macOSでは以下です。

Cmd + Shift + P

検索欄に、

Ruby LSP

と入力すると、Ruby LSP関連のコマンドが表示されます。

例えば、以下があります。

Ruby LSP: Start
Ruby LSP: Restart
Ruby LSP: Stop
Ruby LSP: Update language server gem

設定を変更したあとや動作がおかしい場合は、Ruby LSP: Restartを実行すると改善することがあります。

Ruby LSPが使用するRubyを確認する

Ruby LSPで問題が起こりやすいポイントの一つが、VSCodeとターミナルで異なるRuby環境が使用されることです。

ターミナルでRubyを確認する

まず、VSCodeの統合ターミナルで以下を実行します。

ruby -v

さらに、macOSやLinuxでは以下でRubyのパスを確認できます。

which ruby

Windowsでは以下を利用できます。

where.exe ruby

想定しているRubyとは異なるパスが表示された場合は、Ruby LSP以前にRuby環境の設定を見直す必要があります。

Rubyのバージョンマネージャーを設定する

Ruby LSPにはRubyバージョンマネージャーを自動判定する機能があります。

autoを利用する

通常は以下の設定で問題ありません。

{
  "rubyLsp.rubyVersionManager": {
    "identifier": "auto"
  }
}

autoでは、利用可能なRubyバージョンマネージャーをRuby LSPが自動的に検出します。

なお、autoは標準的な動作なので、必ずしもsettings.jsonに明示的に書く必要はありません。

rbenvなどを明示する

自動判定がうまくいかない場合は、利用しているバージョンマネージャーを明示できます。

例えばrbenvなら以下です。

{
  "rubyLsp.rubyVersionManager": {
    "identifier": "rbenv"
  }
}

Ruby LSPでは、rbenvやmise、asdf、chruby、rvmなど複数の環境に対応しています。

.zshrcや.bashrcの設定を確認する

ターミナルではRubyが正しく動くのに、Ruby LSPではRubyが見つからないことがあります。

これは、VSCodeの拡張機能と通常のターミナルで環境変数が異なることがあるためです。

例えば、Rubyバージョンマネージャーの初期化設定を以下に記述しているケースがあります。

~/.zshrc
~/.bashrc

Ruby LSPはシェルを利用してRuby環境を取得するため、これらの初期化設定が正常に読み込まれることが重要です。

code .から起動する方法も有効

RubyのPATHが正しく認識されない場合は、一度VSCodeを完全に終了します。

そのうえで、Rubyが正常に使えるターミナルから以下を実行します。

code .

ターミナルの環境を引き継げるため、Ruby LSPが正常に起動する場合があります。

Ruby LSPでコード補完を使う

Ruby LSPが正常に動作していれば、Rubyコードを入力している途中で補完候補が表示されます。

例えば、以下のようなコードがあります。

class User
  def hello
    puts "Hello"
  end
end

user = User.new
user.

user.まで入力すると、Ruby LSPが利用可能な情報をもとに補完候補を提示します。

Rubyでは補完が完全ではない場合もある

Rubyは動的型付け言語です。

そのため、JavaやC#のような静的型付け言語と比較すると、常に完全なコード補完ができるとは限りません。

Ruby LSPはプロジェクトや依存Gemをインデックス化し、クラス、モジュール、メソッド、定数などの情報を利用して補完やナビゲーションを提供します。

定義ジャンプを利用する

Ruby LSPでは、クラスやメソッドの定義場所へ移動できます。

例えば、

User.new

のUserにカーソルを合わせて定義へ移動すると、Userクラスが定義されているファイルへジャンプできます。

Windows・Linuxでは通常、

F12

または、

Ctrl + クリック

で移動できます。

macOSでは、

Cmd + クリック

が利用できます。

大規模なRailsプロジェクトでは、ファイルを手動で探す必要が減るため非常に便利です。

Hoverでコード情報を確認する

クラスやメソッドの上にマウスカーソルを置くと、Ruby LSPが関連する情報を表示します。

例えば、

array.map

のmapにカーソルを合わせることで、利用可能なメソッド情報やドキュメントなどを確認できます。

コードを読みながら情報を確認できるため、APIやメソッド仕様を調べる際にも役立ちます。

シンボル検索を利用する

Ruby LSPはプロジェクト内のRubyコードをインデックス化します。

そのため、VSCodeのシンボル検索からクラスやモジュールなどを探せます。

例えば、以下のような名前を検索できます。

User
Order
ApplicationController

大規模なRailsアプリケーションほど、シンボル検索の恩恵が大きくなります。

Ruby LSPでフォーマットする

Ruby LSPではコードフォーマットも利用できます。

Ruby LSPをデフォルトフォーマッターにする

settings.jsonに以下を設定します。

{
  "[ruby]": {
    "editor.defaultFormatter": "Shopify.ruby-lsp",
    "editor.formatOnSave": true
  }
}

これにより、RubyファイルのデフォルトフォーマッターとしてRuby LSPが利用されます。

editor.formatOnSaveを有効にすると、ファイル保存時に自動フォーマットできます。

Ruby LSPのformatter設定

Ruby LSPには以下の設定があります。

{
  "rubyLsp.formatter": "auto"
}

autoではプロジェクトのGemを確認する

autoを指定すると、Ruby LSPがプロジェクトのbundleを確認し、利用可能な対応formatterを判定します。

例えば、プロジェクトにRuboCopが含まれていればRuboCopを利用できます。

Syntax Treeが利用可能な構成では、Syntax Treeを利用することもできます。

利用可能なformatterが存在しない場合は、フォーマット機能が有効にならないこともあります。

そのため、

「Ruby LSPは必ずRuboCopでフォーマットする」

というわけではありません。

RuboCopとRuby LSPを組み合わせる

Ruby LSPはRuboCopと組み合わせて利用できます。

GemfileにRuboCopを追加する

例えば、以下のようにGemfileへ追加します。

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

その後、以下を実行します。

bundle install

Ruby LSPのformatter設定が、

{
  "rubyLsp.formatter": "auto"
}

であれば、プロジェクトのbundleに含まれるRuboCopを検出して利用できます。

グローバルインストールしたRuboCopには注意する

Ruby LSPでは、formatterやlinterはプロジェクトのGemfileやgemspecで管理するのが基本です。

単に、

gem install rubocop

でグローバル環境へ入れただけでは、Ruby LSPから期待どおりに利用できない場合があります。

チーム開発ではGemfileにバージョンを記録した方が、メンバー間で環境を統一しやすいメリットもあります。

RuboCop拡張機能との使い分け

VSCodeにはRuboCop公式拡張機能もあります。

Ruby LSPとRuboCop拡張機能を両方利用する場合は、どちらをフォーマッターにするか決めておくと競合を避けやすくなります。

Ruby LSPをフォーマッターにする場合

{
  "[ruby]": {
    "editor.defaultFormatter": "Shopify.ruby-lsp"
  }
}

RuboCop拡張機能をフォーマッターにする場合

{
  "[ruby]": {
    "editor.defaultFormatter": "rubocop.vscode-rubocop"
  }
}

複数の拡張機能から同じフォーマット機能を有効にすると、設定が分かりにくくなるため注意しましょう。

Ruby LSPのおすすめ設定

Ruby LSPを中心に利用する場合は、例えば以下のように設定できます。

{
  "[ruby]": {
    "editor.defaultFormatter": "Shopify.ruby-lsp",
    "editor.formatOnSave": true,
    "editor.tabSize": 2,
    "editor.insertSpaces": true,
    "editor.semanticHighlighting.enabled": true,
    "editor.formatOnType": true
  },
  "rubyLsp.formatter": "auto"
}

Rubyバージョンマネージャーを自動判定させる場合、rubyLsp.rubyVersionManagerは省略しても構いません。

チーム開発では、個人の好みだけで設定せず、既存の.vscode/settings.jsonやRuboCop設定に合わせることが重要です。

.ruby-lspディレクトリとは

Ruby LSPを利用すると、プロジェクト内に以下のディレクトリが作成される場合があります。

.ruby-lsp

これは異常ではありません。

Ruby LSP用のbundleを管理する

VSCode版Ruby LSPでは、Language Serverを動作させるためのcomposed bundleを.ruby-lsp内に構築します。

そのため、通常はRuby LSPを使うためだけにGemfileへ、

gem "ruby-lsp"

を必ず追加する必要はありません。

VSCode拡張機能側がRuby LSP実行用の環境を構築します。

.ruby-lspが突然作成されても、不具合と判断する必要はありません。

RailsでRuby LSPを使う方法

Ruby LSPはRailsプロジェクトでも利用できます。

基本的な流れは通常のRubyプロジェクトと同じです。

Railsプロジェクトで準備する

まず、Railsプロジェクトで以下を実行します。

bundle install

その後、RailsプロジェクトのルートをVSCodeで開きます。

code .

Ruby LSPが起動すれば、Railsアプリケーション内でも定義ジャンプや補完などが利用できます。

ruby-lsp-railsでRails統合を強化する

Rails固有の機能をさらに強化したい場合は、ruby-lsp-railsを利用できます。

Gemfileに追加する例は以下です。

group :development do
  gem "ruby-lsp-rails"
end

その後、以下を実行します。

bundle install

ruby-lsp-railsは必須ではない

RailsでRuby LSPを利用するために、ruby-lsp-railsが必須というわけではありません。

Ruby LSP単体でもRailsプロジェクトで利用できます。

ruby-lsp-railsは、Rails固有のテストやフレームワーク統合を強化したい場合に追加するGemと考えると分かりやすいでしょう。

Rails GeneratorをVSCodeから実行する

Ruby LSPにはRails GeneratorをVSCodeのUIから実行できる機能もあります。

Railsでは通常、

rails generate model User

や、

rails generate controller Users

などのコマンドを利用します。

Ruby LSPを使うことで、こうしたRails Generator関連の操作をVSCodeから行いやすくなります。

Ruby LSPでデバッグする

Ruby LSPはRubyのデバッグにも対応しています。

Rubyでは一般的にdebug gemが利用されます。

debug gemを利用する

RailsなどではGemfileにdebugが含まれている構成も多くあります。

必要に応じて、以下のように利用します。

gem "debug"

Ruby LSPとdebug gemを組み合わせることで、VSCode上にブレークポイントを設定し、コードを停止させながら変数などを確認できます。

Ruby LSPでテストを実行する

Ruby LSPでは、VSCodeのTest ExplorerやCodeLensからRubyのテストを実行できます。

プロジェクト構成やテストフレームワークが対応していれば、テストコードの近くに実行ボタンが表示されます。

そこから、

  • テスト実行
  • ターミナルでの実行
  • デバッグ実行

などが可能です。

Railsプロジェクトではruby-lsp-railsを追加することで、Rails固有のテスト統合を強化できます。

Ruby LSPが動かない場合の対処法

Ruby LSPが起動しない場合は、拡張機能をすぐに再インストールするより、Ruby環境を順番に確認する方が効率的です。

Rubyのバージョンを確認する

VSCodeの統合ターミナルで以下を実行します。

ruby -v

想定しているRubyが表示されるか確認します。

Rubyのパスを確認する

macOSやLinuxでは以下です。

which ruby

Windowsでは以下です。

where.exe ruby

Ruby LSPが使用すべきRubyと一致しているか確認しましょう。

Gemfileがある場合はbundle installを実行する

Gemfileを使用しているプロジェクトでは以下を実行します。

bundle install

依存Gemが不足していると、Ruby LSPの起動やformatterの検出に失敗する場合があります。

Ruby LSPを再起動する

コマンドパレットから、

Ruby LSP: Restart

を実行します。

設定変更後にも有効です。

VSCodeを完全に再起動する

RubyやRubyバージョンマネージャーをインストールした直後は、VSCodeが古い環境変数を保持している場合があります。

その場合はVSCodeを完全に終了し、再度起動します。

可能であれば、Rubyが正常に動作するターミナルから、

code .

で起動すると改善する場合があります。

Ruby LSPを手動で起動して確認する

Ruby LSPの起動問題を調査する場合、手動でLanguage Serverを起動してエラーを確認する方法があります。

実行するコマンドは以下です。

ruby-lsp

bundle exec ruby-lspは使わない

Ruby LSPの公式トラブルシューティングでは、手動起動時に、

bundle exec ruby-lsp

を利用しないよう案内されています。

VSCode版Ruby LSPは独自のcomposed bundleを利用するためです。

トラブルシューティングでは、

ruby-lsp

で直接起動して確認します。

Ruby LSPのログを確認する

Ruby LSPが起動しない場合は、VSCodeの出力パネルも確認します。

特に以下に関するエラーを確認しましょう。

Ruby version
Ruby path
Bundler
Gem
Ruby version manager
Shell
PATH

Ruby LSPでは、ターミナルとVSCode拡張機能で環境変数が異なることが原因になるケースが少なくありません。

古いRubyを使っている場合の注意点

Ruby LSPは、どのRubyバージョンでも最新バージョンが利用できるわけではありません。

Ruby LSPや内部で利用されるPrismなどは、サポート中のRubyバージョンを中心に開発されています。

EOLを迎えた古いRubyでは、最新のRuby LSPが正常に動作しない場合があります。

古いRubyで利用する方法

古いRubyプロジェクトでは、以下のような対応が考えられます。

  • Ruby LSPの旧バージョンを利用する
  • 対応するVSCode拡張機能のバージョンを利用する
  • Ruby LSP専用のGemfileを用意する
  • 別のRuby環境からLanguage Serverを動作させる

Ruby LSPでは、Language Server用Gemfileを指定する設定も利用できます。

{
  "rubyLsp.bundleGemfile": "/path/to/Gemfile"
}

レガシーRubyを保守している場合に役立つ設定です。

Solargraphとの併用には注意する

Ruby向けLanguage ServerとしてはSolargraphも存在します。

Ruby LSPとSolargraphを同時に有効にすると、機能が重複する場合があります。

例えば、以下です。

  • コード補完
  • 定義ジャンプ
  • Hover
  • Diagnostics
  • Formatting

複数の拡張機能が同じ機能を提供すると、どの拡張機能が処理しているのか分かりにくくなります。

Ruby LSPをメインにする場合は、不要なRuby Language Serverを無効にしておくとトラブルを減らしやすくなります。

Dev ContainerでRuby LSPを使う場合

DockerやDev Containerを利用してRubyを開発している場合は、Ruby LSPをどの環境で動かしているかが重要です。

例えば、以下のような構成があります。

Windows
  ↓
VSCode
  ↓
Dev Container
  ├─ Ruby
  ├─ Bundler
  ├─ Rails
  └─ Gem

この場合、Ruby LSPもRubyやGemが存在するコンテナ側で動作する構成にする必要があります。

VSCodeのDev Containersを使用する場合は、Ruby LSP拡張機能がRemote側で有効になっているか確認しましょう。

VSCodeでRuby LSPを使う基本的な流れ

VSCodeでRuby LSPを利用する場合は、以下の流れで設定すると分かりやすいです。

  1. Rubyをインストールする
  2. 必要に応じてRubyバージョンマネージャーを設定する
  3. Bundlerを利用できる状態にする
  4. Gemfileがある場合はbundle installする
  5. VSCodeにShopifyのRuby LSPをインストールする
  6. RubyプロジェクトのルートをVSCodeで開く
  7. Rubyファイルを開いてRuby LSPを起動する
  8. 補完や定義ジャンプが動作するか確認する
  9. formatterやRuboCopを設定する
  10. 必要に応じてデバッグやテスト機能を利用する

まとめ

Ruby LSPは、VSCodeでRubyを開発するなら導入を検討したい拡張機能です。

コード補完だけでなく、定義ジャンプ、シンボル検索、フォーマット、Diagnostics、テスト、デバッグ、Rails連携など、Ruby開発に必要な機能を幅広く提供します。

導入自体は比較的簡単ですが、Ruby LSPはRubyのバージョン、Bundler、Gemfile、Rubyバージョンマネージャー、PATHなどの影響を受けます。

そのため、Ruby LSPが動かない場合は、拡張機能を何度も再インストールするよりも、まずVSCodeがどのRubyを認識しているかを確認することが重要です。

また、フォーマッターについては「Ruby LSPが必ずRuboCopを使う」と考えるのではなく、rubyLsp.formatterの設定やプロジェクトのGem構成によって動作が決まる点も覚えておきましょう。

RubyとVSCodeの環境を正しく整えれば、Ruby LSPによってRubyやRailsの開発効率を大きく高められます。

以上、VSCodeでRuby LSPを使う方法についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次