問題
Windows Subsystem for LinuxのUbuntu(Bash on Ubuntu on Windows)にRuby / rubocopが入っている状態でVisual Studio Codeのrubocop拡張を使おうとしても
- rubocop.bat is not executable
- execute path is empty! please check ruby.rubocop.executePath
などというエラーが発生し正常に動作しない。
原因
Visual Studio Code がWindowsの環境を参照しておりWLSが正しく認識されていない。
環境
- Windows Subsystem for Linux
- Bash
- Microsoft Store から入手
- Ruby 2.4.1
- Windows 上ではなく Windows Subsystem for Linux 上に存在
- rbenv によるインストール
経過
概要
- Visual Studio Code に Windows Subsystem for Linux のUbuntu環境を読み込ませる
- 成功
- rubocop拡張に Windows Subsystem for Linux 上にあるgemのrubocopの位置を教える
- 失敗
詳細
1. Visual Studio Code に Windows Subsystem for Linux のUbuntu環境を読み込ませる
Visual Studio Code 内でターミナルを開く(Ctrl + ` ≒ Ctrl + Shift + @)と通常はコマンドプロンプトまたはPowerShellが起動される。これが Visual Studio Code が認識している環境と思われる。よって、このターミナル設定をUbuntuのものに変更する。
設定方法は、上部のツールバーから ファイル → 基本設定 → 設定 で設定を開き、ユーザー設定タブの{}で囲まれた部分に
"terminal.integrated.shell.windows": "C:/Windows/System32/wsl.exe",
を書き込む。この際、Ubuntuを使う設定を現在のワークスペース(要するに大体現在開いているフォルダ)のみに適用したい場合、上文を設定画面の「ユーザー設定」タブでなく「ワークスペースの設定」タブに書き込む。
これによりエラーメッセージが「rubocop.bat is not executable」から「execute path is empty! please check ruby.rubocop.executePath」に変化する。
2. rubocop拡張に Windows Subsystem for Linux 上にあるgemのrubocopの位置を教える
上記設定に同様にrubocopのパスを設定する。
まず、Windows Subsystem for Linux のUbuntuにおけるルートディレクトリは、Windows側からみると
C:/Users/【ユーザー名】/AppData/Local/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs
に存在する(※Windows上に存在するファイルをUbuntuから編集する分にはあまり問題はないが、Ubuntu上のファイルをWindowsで編集するとUbuntu環境の破損につながる可能性もあるため注意する必要がある)。さらに、rbenvでインストールしたRuby2.4.1のgemの格納場所は、Ubuntu側からみると
home\【ユーザー名】\.rbenv\versions\2.4.1\lib\ruby\gems\2.4.0\gems
であり、その中のrubocopは例えば
rubocop-0.52.1/bin
に「rubocop」というファイル名で存在する。以上より、すべてつなげると
C:\Users\【Windowsユーザー名】\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\home\【Ubuntuユーザー名】\.rbenv\versions\2.4.1\lib\ruby\gems\2.4.0\gems\rubocop-0.52.1\bin
が目的とするrubocop実行ファイルの存在するディレクトリのアドレスである。
そこで、Visual Studio Code 拡張「ruby-rubocop」におけるrubocop実行ファイルが存在するフォルダの指定方法に従って設定の{}で囲まれた部分に
"ruby.rubocop.executePath": "C:/Users/【Windowsユーザー名】/AppData/Local/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/home/【Ubuntuユーザー名】/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/rubocop-0.52.1/bin/",
を記述し保存する。しかし、これを行っても「ruby-rubocop」が「rubocop.bat」というファイル名を指定しているため、実行タイミングでファイルが見つからないという旨のエラーメッセージが表示される。そこで、上記ディレクトリ内の「rubocop」ファイルを「rubocop.bat」というファイル名でコピーしてみるも、今度は文字化けによる非常に長いエラーメッセージが表示され同様に正しく実行できなかった。
以上よりWindows Subsystem for Linux(Bash on Ubuntu on Windows)上のrubocopをVisual Studio Code 拡張「ruby-rubocop」で使用することはできないと考えられる。
考察
Windows Subsystem for Linux に Visual Studio Code を入れてそちら側からのrubocop拡張インストールで使用可能な可能性がある。しかし、公式サイトからダウンロードしたDebian/Ubuntu向け Visual Studio Code を Windows Linux Subsystem のUbuntuにインストールして実行してもGUIウィンドウを表示することはできなかった。Windows Subsystem for Linux 上で一般にGUIウィンドウを表示させる方法はこちら。
他の方法としては Windows 側に Ubuntu と全く同じRubyバージョンをインストールし、そのgemとしてrubocopをインストールする方法が考えられる。Windows環境ではpathを自力で通すなどすればrbenvなどを用いずと複数バージョンのRubyが比較的簡単に共存可能である。上記の通りruby-rubocopのpath設定を行えば通常通り実行可能である。
拡張機能ruby-rubocopは個人により制作された拡張機能である。Windows Subsystem for Linux の Ubuntu上でネイティブに使いたいのであれば、いっそのこと公開されているソースコードをもとに自力で拡張機能を製作するのが一番良い方法かもしれない。