🌟

Dev Containerを用いてCursorでRubyのコードジャンプを実現する

に公開

こんにちは!普段Ruby on Railsを使って開発をしているourly株式会社の@ourly_nobuoです。

最近、開発エディタをRubyMineからCursorに移行しました。
https://www.cursor.com/ja

CursorのAI機能は非常に強力で開発体験が大きく向上したのですが、一つだけ困っていた点がありました。

それは、Rubyファイルでコードジャンプがデフォルトではできないことです。RubyMineでは当たり前のように使っていた機能なので、これが使えないのは想像以上に開発効率に影響がありました。
(毎回ファイル検索してメソッドに飛ぶ始末…)

そこで今回は、Cursor環境でRubyのコードジャンプを快適に行うための環境構築手順を紹介します。

今回使用する技術スタック

コードジャンプ環境を実現するために、今回は以下の技術を利用しました。

  1. Dev Container
  2. Ruby LSP

Dev Containerとは?

Dev Containerは、開発環境をDockerコンテナ内に構築・管理するための仕組み(仕様)です。VS CodeやCursorの拡張機能としても提供されています。

コンテナ内にCursor(VS Code)のサーバーを立ち上げ、ローカルのUIから接続してあたかもコンテナ内でエディターが機能するようなイメージです。

Dev Containerを導入することで、以下のようなメリットがあります。

  • 開発環境の再現性向上: Dockerfiledevcontainer.jsonで環境構成をコード化できるため、誰でも同じ環境を簡単に構築できます。
  • ローカル環境の汚染防止: 必要なツールやライブラリはコンテナ内に閉じ込められるため、ローカルPCの環境をクリーンに保てます。
  • プロジェクトごとの環境分離: プロジェクトごとに異なるバージョンのRubyやライブラリを簡単に使い分けられます。

Dev Containerの詳細については、以下の記事が参考になりました。

https://zenn.dev/bells17/articles/devcontainer-2024

Ruby LSPとは?

Shopify が中心となって開発を進めているRuby用のLanguage Serverです。

Rubyコードのためのインテリセンス(コード補完、ドキュメント表示など)やコードジャンプ機能を提供するLanguage Server Protocol(LSP)の実装の一つです。Gemとして提供されており、多くのエディタで利用できます。

https://github.com/Shopify/ruby-lsp

今回はこのRuby LSPを利用して、Cursor上でコードジャンプ機能を実現します。

(番外編)Solargraph

RubyのLanguage Serverを構築する手段としては Solargraph もよく使われます。

https://github.com/castwide/solargraph

Solargraphの役割はRuby LSPと似ており、以下の内容を実現できます。

  • コンテキスト依存の補完
  • メソッド/クラス定義へのジャンプ
  • ドキュメントホバー表示
  • 静的解析による軽量な型チェック

ただし私はDev Container環境でSolargraphによるコードジャンプをうまく実現できなかったので、特に指定がなければRuby LSPを使用することをお勧めします。

環境構築の手順

それでは、実際に環境を構築していきましょう。

1. Gemfileを追加

まず、プロジェクトのGemfileruby-lspを追加します。

# 開発用のグループがあれば、そこに追加する
group :development do
  gem 'ruby-lsp'
  # 他の開発用Gem...
end

Dev Container上でGemfileをインストールするため、ローカルでの bundle install は不要です。

2. 必要な拡張機能のインストール

Cursorに以下の拡張機能をインストールします。

  • Dev Container
  • Ruby LSP

3. devcontainer.jsonの作成

プロジェクトのルートディレクトリに.devcontainerディレクトリを作成し、その中にdevcontainer.jsonファイルを作成します。

your-project-root/
├── .devcontainer/
│   └── devcontainer.json
├── app/
├── config/
├── Gemfile
├── Gemfile.lock
└── ...

devcontainer.jsonに様々な設定を記述していきます。今回はコードジャンプを実現するための最低限の設定となっているため、必要に応じて設定を追加してください。

{
    "name": "Ruby Dev Container",
    "image": "ruby:3.4-bullseye",
    "workspaceFolder": "/workspaces/your-project-root",
    "postCreateCommand": "bundle check || bundle install",
    "customizations": {
        "vscode": {
            "extensions": [
                "Shopify.ruby-lsp"
            ]
        }
    }
}

ポイント:

  • image:
    • 今回は公式のRubyイメージ ruby:3.1.4-bullseye を使用しました。
    • リモートサーバー起動のためのライブラリ不足を防ぐため、一般的なDebianベースのimageを使用するのがオススメです。
  • postCreateCommand:
    • コンテナ初回起動時に自動で実行したいコマンドを指定できます。
    • インストール済みの場合にスキップできるよう、 bundle check を事前に行なっています。

4. Dev Containerの起動

devcontainer.jsonを作成したら、shift + Cmd + p で「Reopen in Container」を選択してDev Containerを起動します。
初回起動時はイメージのプルやビルドに時間がかかる場合があります。

5. コードジャンプの実行

Dev Containerが起動し、Gemfileのインストールが完了したら準備は完了です!.rbファイルを開き、メソッド名などにカーソルを合わせて、Cmd を押しながらクリック or F12を押してみてください。定義元へジャンプできれば成功です!

初回はプロジェクトファイルの読み込みで、コードジャンプまで時間がかかります。

まとめ

今回は、Cursor環境でDev ContainerとRuby LSPを利用してRubyのコードジャンプを実現する方法を紹介しました。

これにより、RubyMineほどまではいきませんが、コードジャンプをCursorでも実現できました。これでCursorの強力なAI機能と合わせて、より効率的にRuby開発を進められるはずです!

ただ、実際に使ってみると、メソッド定義へのジャンプやホバー時の情報表示に少し時間がかかるという印象です。これは、既存のDocker Compose環境との兼ね合いや設定の問題かもしれません。今後、このパフォーマンスについても調査・改善していきたいと考えています。

この記事が、CursorでRuby開発を行う方の助けになれば幸いです。

ourly tech blog

Discussion