35歳からの中二病エンジニア

社寺・鉄道・アニメを愛でるウェブ技術者の呟き

IntelliJでWSL上のDocker上のRubyをリモートインタープリター設定する

Windows版IntelliJ IDEA(おそらくRubyMineでもほぼ同様)を使いつつ、WSL上のDocker上のRubyを開発環境としている場合、インタープリター設定はどうするのが良いかという話。

TL;DR

  1. [Settings] - [Build, Execution, Deployment] - [Docker] でDocker設定を追加する。
  2. [Project Structure] - [Platform Settings] - [SDKs] でRuby SDKを追加する。
  3. [Project Structure] - [Project] の [Project SDK:] に追加したRuby SDKを指定する。
  4. DockerコンテナのWORKDIRが /opt/project 以外の場合はエラーになる場合があるので要注意。

背景と前提

Mac環境下ではIntelliJのリモートインタープリターでDocker上のRubyを指定すると激重だったので、泣く泣くローカル環境にもRubyをインストールして bundle install もして、ローカルインタープリター設定にしていた。しかしWindowsに移行してからはDockerもIntelliJもサクサクなので、リモートインタープリター設定が上手く行くのではないかと思って試してみた。

ちなみに、既にRubyプロジェクトが存在し、WSL上でDockerが動く状態になっていることが前提なので注意されたい。なお本記事で使用しているバージョンは、IntelliJ IDEA 2020.2とDocker Desktop 2.4.0.0なので参考まで。

Docker設定を追加する

[Settings] - [Build, Execution, Deployment] - [Docker] を開くと、IntelliJからDockerを制御するための設定が行える。ここの操作は簡単で、[+] ボタンを押下して反映するだけで良い。名前はデフォルトの Docker が気に入らなければお好みで。

f:id:aikawame:20201019235908p:plain

Ruby SDKを追加する

ここがリモートインタープリター設定の肝となる。まずは [Project Structure] - [Platform Settings] - [SDKs] を開いて [+] ボタンを押下し、[Add Ruby SDK...] - [New remote...] を順に選択する。

f:id:aikawame:20201019233725p:plain

すると、以下のようなリモートインタープリターの設定ダイアログが開くので、各々のDocker環境に合わせてよしなに設定する。

f:id:aikawame:20201019233848p:plain

ここまで行うと、IntelliJがインタープリターの設定を行ってGemの読み込みやら何やらを良い感じにやってくれる。以降は特に意識しなくてもローカルインタープリターと同様に利用できるので、Gemのメソッドを参照したりRuboCopを動かしたりと自在に活用することができるはずだ。

ただ一点注意事項があって、DockerコンテナのWORKDIRが /opt/project 以外になっていると、僕の環境では以下のようなエラーが発生してRuboCopが動作しなかった。

Error:Rubocop returned exit code: 126 stdout: OCI runtime exec failed: exec failed: container_linux.go:349: starting container process caused "chdir to cwd (\"/opt/project\") set in config.json failed: no such file or directory": unknown

WORKDIRを変更することで解消したので深くは調べられていないのだけれども、他のプロジェクトでも /opt/project を参照しようとして bundle が見つからないと言われたりと、RuboCopに限らず何らか上手く行かないので、どこかでこのディレクトリーを決め打ちにしている箇所があるのかもしれない。

おわりに

Windows環境だとローカルにRubyやら開発系の実行環境をインストールするのは正直キツいものがある。WSL上ならばまだマシとはいえ、Docker上に環境があるのに二重管理するのはやっぱりだるい。というわけでリモートインタープリター設定を試行錯誤していたのだけれども、上手く行ってホッとしている。WSLを使い込んでいる猛者の方々はX Windowを導入してIDEも含めてWSLで完結させている昨今だけれども、そこまでは流石に…という向きであればこれでも十分に使える環境が作れるのではないかと思う。