Docker 環境で VSCode に Solargraph を導入するときの 2 つの方法
Docker で開発している環境に Solargraph を導入しようとして、やり方に迷ったのでメモ。
方法は以下の 2 つ。
- Solargraph を Docker のコンテナとして用意する
- システムの Ruby に Solargraph をインストールする
Docker・Solargraph の仕組みを完全には理解していないので、間違いがあったらぜひ指摘してください。
1. Solargraph を Docker コンテナとして用意する場合
Solargraph 用のコンテナを作成し、それを起動させておくことで Solargraph の機能を利用する。
VSCode での利用もサポートされている。
solargraph:
build: .
command: bundle exec solargraph socket --host=0.0.0.0 --port=7658
volumes:
- .:/app
ports:
- "7658:7658"
"solargraph.externalServer": {
"host": "localhost",
"port": 7658
},
"solargraph.transport": "external"
メリット
- ローカルを汚さない
デメリット
- Gemfile や docker-compose に Solargraph が入る(チーム開発だと微妙なケースがあるかも)
- 回避もできる(参照:SolargraphをDocker環境でこっそり使う)
参考
- Docker環境でsolargraphを使う方法|Qiita
- 【Solargraph】Solargraph用のコンテナを作成する【Docker】|Qiita
- SolargraphをDocker環境でこっそり使う
方法 1 を試した結果
Solargraph のコンテナを立ち上げることはできたし、 VSCode 上で補完やリント(rubocop による)を確認することができた。
しかし、プロジェクトルートに置いていた .solargraph.yml
や .rubocop.yml
の設定が反映されなかった。
この現象は Solargraph の GitHub リポジトリの issue のスレッドでも報告されている。
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.yml
のreporters:
やrequire_paths:
への変更が効かない -
.rubocop.yml
に書いた除外パターンも効かない
という具合である。
自分の環境でも全く同じ症状が再現された。
このレスに対しては反応も返信もないので、解決されていないのだろうか……(とりあえず反応しておいた)
このスレッドをもう少し読むと解決策が見つかりそうな気もします。
(が、ネタバレすると方法 2 を取ってしまったのでここは誰かに託します)
2. システムの Ruby に Solargraph をインストールする
システム(ローカル)の Ruby に Solargraph gem をインストールし、VSCode にその実行パスを渡してやることで Solargraph の機能を実行する。
Solargraph は開発の補助的な存在で開発環境全体というより個人に依存するものと捉えるほうが自然なので、個人的にはローカルで実行するほうがしっくり来ます。
メリット
- 設定が簡単
- Gemfile や docker-compose をいじらないので開発環境に影響を与えない
- 問題なく
.solargraph.yml
や.rubocop.yml
が効く
デメリット
- ローカルの ruby を汚す
-
.rubocop.yml
でrequire: rubocop-rails
などを指定している場合、それらの gem もローカルにインストールしないといけなくなる
上述の通り、ローカルの ruby に Solargraph をはじめとしていくつかの gem のインストールが必要になります。 直接 gem install
すると他プロジェクトにも影響が出るのが難点です。 bundler を使うと「Gemfile や docker-compose をいじらないので開発環境に影響を与えない」というメリットを崩してしまうので個人的にはちょっと気になります。この辺は好みでご選択ください。
おわり
以上です。
ちなみに自分は「システム ruby なんてそんな使わんやろ」の精神で gem install
しました()
Discussion