はじめに
最近、Rubyの開発環境において、多くの開発チームやプロジェクトで、VSCode から RubyMine への移行が進んでいる。
RubyMine は JetBrains 独自のコード解析機能を提供し、現時点では確かに ruby-lspより優れているように感じる。言語に依らず開発者が好きなエディタで開発できるのが、本来あるべき LSP を用いた開発環境の姿であるが、複数の言語を扱うプロジェクトにおいて、開発環境の分断化がされがちである。
- JavaScript や TypeScript ならば VSCode
- Ruby の開発には RubyMine
- Go の開発には VSCode / GoLand
OSSとしてのRuby LSPの発展には、実際の開発現場からのフィードバックや貢献が必要である。なので、その第一歩として、単純に「使ってみる」ことから貢献しませんか?
本章では、使い方、どんな機能があるか、貢献の仕方、について紹介する。
使ってみよう
bundle install
# Gemfile
source "https://rubygems.org"
group :development do
gem "ruby-lsp", require: false
gem "rubocop", require: false
end
VScodeの設定
拡張をインストール
その他エディタへの導入
参照
既存プロジェクトで最新バージョンを試す
- プロジェクトの一つ上の階層に独自のワークスペースを作成する
- 独自でワークスペース(
lsp.code-workspace
)を作り、"rubyLsp.bundleGemfile":
など必要な設定があれば追加 - ワークスペースから既存プロジェクトを開く
# イメージ
workspace/
├── Gemfile # ruby-lspの最新バージョンを指定
├── workspace.code-workspace # パスの調整が必要な場合は、必要に応じで作成
└── your-project/ # 既存のプロジェクト
├── Gemfile
└── ...
どんな機能がある
基本は直感的に利用できる、よく使う代表例3つ紹介
1. 参照箇所検索
VScodeのサイドバーに参照箇所一覧が表示される。
class User
attr_reader :name
def initialize(name:)
@name = name
end
def greeting # 👈 右クリック `find all reference`で参照箇所一覧を表示
"Hello, #{name}!"
end
end
現状、全てのクラスのgreeting
を検索してしまう課題はある。
2. 定義ジャンプ
command + clickで定義元へジャンプする
user = User.new(name: 'Ruby')
user.greeting # 👈 Userのgreetingへジャンプ
admin = Admin.new(name: 'Kotlin')
admin.greeting # 👈 Adminのgreetingへジャンプ
3. 型推論
インスタンス名からクラスを推論し、インスタンスが持つメソッドを提案する
# `user` が Userクラスのインスタンスであることを推論する
user = User.new(name: 'Ruby')
user.gre # Userクラスが持つメソッドを提案 `greeting`
# 変数`k` は Userクラスのインスタンスであることを推論しない
k = User.new(name: 'Kotlin')
k.gre # クラスが持つメソッドを提案しない
user = Admin.new(name: 'Ruby')
# ⚠️ Userインスタンスと推論するので、Adminで定義していてもUserのgreetingにジャンプ
user.greeting
推論ミスで関係ない型を提案したり、意図しない定義ジャンプすることもある。
User
クラスが既に定義されている場合、別箇所でuser
を呼ぶと暗黙的にuser
は User
インスタンスと識別する。
その他にもいろんな機能が搭載されている
機能の課題
-
推論に依存した機能が多い
- 変数名などの命名規則にこだわる必要がある
- 推論でなく型を明記できる方法として、RBSを検討しているらしい
-
AddOn連携と、Rails AddOnの開発に注力しているそう
- 開発者が独自でruby-lspをカスタムすることができるようになる
- 欲しい機能 🥺
- YardのAddOn?
- AST関係ないが、文字パターンを解析して、特定ファイルにジャンプ
貢献してみる
開発環境のセットアップ
- クローンしてVSCodeを開く
git clone https://github.com/Shopify/ruby-lsp.git code ruby-lsp
- 依存ツールインストール
# root bundle install # cd vscode yarn install
開発の方法
ruby-lspでは、大きくvscode拡張機能とlsp開発があり、それぞれデバッグ方法は異なる
LSP 開発
-
ワークスペース
/lsp.code-workspace
を開く -
検証用プロジェクト サーバー起動、CMD/CTRL + SHIFT + P → 入力 「
Debug the Ruby LSP
」
-
既存のプロジェクトを用いて検証できる状態になる
-
検証して、開発!
VSCode拡張の開発
- ワークスペース
/lsp.code-workspace
を開く - ruby-lsp Vscode
Run/Debug
→ 「Run Extension
」
- 拡張デバッグ用のエディタが開くので、任意の検証用プロジェクトを開く
- 検証して、開発!
テストスクリプトの書き方は公式ドキュメントを参考
LSPのリクエスト周りの定義を理解する
LSPの用語や説明をまとめたドキュメント
課題を見つける
- 100近く課題があり、今時点で毎日のペースで消化されており、日々進化している!
- PRやコミット方法に厳格なルールはないので気軽に参加できる
コミット例(私の)
最後に
商用ツールに頼らずもっとOSSとしていいものをいろんな人が快適にRubyを使えるようになればいいなと思う。
MCPよりLSP!