組合式 Ruby LSP 套件

在 Ruby 以外的語言生態系統中,將編輯器工具新增為專案依賴項並不是很常見。通常,語言伺服器是一個可執行的檔案,會被下載並獨立於您的專案執行。

在 Ruby 生態系統中,要完全採用這種方法存在一些阻礙

  1. 不使用 Ruby 編寫語言伺服器,將會難以與社群中已使用 Ruby 編寫的現有工具(例如測試框架、linter、格式化工具等)無縫整合
  2. 自動偵測專案依賴項可讓語言伺服器偵測必須讀取和索引的磁碟檔案,以便我們可以從 gem 中提取宣告,而無需使用者進行任何設定。這表示我們需要直接與 Bundler 整合
  3. Bundler 只允許要求設定為 $LOAD_PATH 一部分的 gem。如果 Ruby LSP 可執行檔獨立於全域安裝執行,則 Ruby 程序只能要求 Ruby LSP 自己的依賴項,而無法要求專案正在使用的任何 gem。無法要求專案的依賴項會限制語言伺服器可以自動與 linter、格式化工具、測試框架等進行的整合

為了克服這些限制,同時又不要求使用者將 ruby-lsp 新增為專案的依賴項,Ruby LSP 使用組合式套件策略。執行流程如下

  1. 可執行檔以 ruby-lsp 執行,不使用 bundle exec,以表明必須先設定組合式套件
  2. 可執行檔會在 your_project/.ruby-lsp 下設定一個組合式套件。產生的 Gemfile 包含 ruby-lsp gem 和專案 Gemfile 中的所有內容。它也可能包含 debugruby-lsp-rails
  3. 設定完成組合式套件後,原始的 ruby-lsp Ruby 程序將完全被 BUNDLE_GEMFILE=.ruby-lsp/Gemfile bundle exec ruby-lsp 取代,從而啟動真正的語言伺服器,並可以存取專案的依賴項,而無需將 gem 新增到專案本身的 Gemfile 中

除了執行此設定外,組合式套件邏輯還會執行 bundle install 並嘗試自動更新 ruby-lsp 語言伺服器 gem,以確保快速發布錯誤修正和新功能。

設定組合式套件需要與 Bundler 進行多項整合,並且需要考慮許多邊緣情況,例如如何處理設定或安裝私人依賴項。如果您在組合式套件設定方面遇到問題,請透過回報問題讓我們知道。