🌞

Docker 環境で VSCode に Solargraph を導入するときの 2 つの方法

2023/07/19に公開

Docker で開発している環境に Solargraph を導入しようとして、やり方に迷ったのでメモ。
方法は以下の 2 つ。

  1. Solargraph を Docker のコンテナとして用意する
  2. システムの Ruby に Solargraph をインストールする

Docker・Solargraph の仕組みを完全には理解していないので、間違いがあったらぜひ指摘してください。

1. Solargraph を Docker コンテナとして用意する場合

Solargraph 用のコンテナを作成し、それを起動させておくことで Solargraph の機能を利用する。
VSCode での利用もサポートされている。

docker-compose.yml
solargraph:
    build: .
    command: bundle exec solargraph socket --host=0.0.0.0 --port=7658
    volumes:
      - .:/app
    ports:
      - "7658:7658"
settings.json
"solargraph.externalServer": {
  "host": "localhost",
  "port": 7658
},
"solargraph.transport": "external"

メリット

  • ローカルを汚さない

デメリット

参考

方法 1 を試した結果

Solargraph のコンテナを立ち上げることはできたし、 VSCode 上で補完やリント(rubocop による)を確認することができた。
しかし、プロジェクトルートに置いていた .solargraph.yml.rubocop.yml の設定が反映されなかった。

この現象は Solargraph の GitHub リポジトリの issue のスレッドでも報告されている。
https://github.com/castwide/vscode-solargraph/issues/26#issuecomment-504543086

I've had some good success with the following approach. Here's what I'm able to get:
✔Intellisense for core ruby and gems
✔Diagnostics (Rubocop and require_not_found)
❌Intellisense for my own application code
❌Changing reporters: or require_paths: in .solargraph.yaml seems to have no effect on what diagnostics I see in VS Code
❌Changing exclude patterns for cops in .rubocop.yml seems to have no effect on what diagnostics I see in VS Code

日本語にすると、

  • コアな ruby と gem に対するインテリセンスは働く
  • Rubocop と require_not_found へのリントは働く
  • 自身のアプリケーションコード(自分で定義したクラスなど)に対するインテリセンスは働かない
  • .solargraph.ymlreporters:require_paths: への変更が効かない
  • .rubocop.yml に書いた除外パターンも効かない

という具合である。
自分の環境でも全く同じ症状が再現された。
このレスに対しては反応も返信もないので、解決されていないのだろうか……(とりあえず反応しておいた)

このスレッドをもう少し読むと解決策が見つかりそうな気もします。
(が、ネタバレすると方法 2 を取ってしまったのでここは誰かに託します)

2. システムの Ruby に Solargraph をインストールする

システム(ローカル)の Ruby に Solargraph gem をインストールし、VSCode にその実行パスを渡してやることで Solargraph の機能を実行する。

Solargraph は開発の補助的な存在で開発環境全体というより個人に依存するものと捉えるほうが自然なので、個人的にはローカルで実行するほうがしっくり来ます。

メリット

  • 設定が簡単
  • Gemfile や docker-compose をいじらないので開発環境に影響を与えない
  • 問題なく .solargraph.yml.rubocop.yml が効く

デメリット

  • ローカルの ruby を汚す
  • .rubocop.ymlrequire: rubocop-rails などを指定している場合、それらの gem もローカルにインストールしないといけなくなる

上述の通り、ローカルの ruby に Solargraph をはじめとしていくつかの gem のインストールが必要になります。 直接 gem install すると他プロジェクトにも影響が出るのが難点です。 bundler を使うと「Gemfile や docker-compose をいじらないので開発環境に影響を与えない」というメリットを崩してしまうので個人的にはちょっと気になります。この辺は好みでご選択ください。

おわり

以上です。
ちなみに自分は「システム ruby なんてそんな使わんやろ」の精神で gem install しました()

Discussion