【NG集】Windows Subsystem for Linux（Bash on Ubuntu on Windows）上のrubocopをVisual Studio Code 拡張「ruby-rubocop」で使用→失敗

# 問題
　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 によるインストール

# 経過
## 概要
1. Visual Studio Code に Windows Subsystem for Linux のUbuntu環境を読み込ませる
    * 成功
2. 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のものに変更する。
　設定方法は、上部のツールバーから **ファイル → 基本設定 → 設定** で設定を開き、ユーザー設定タブの{}で囲まれた部分に

```json:settings.json
    "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側からみると

```powershell
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」というファイル名で存在する。以上より、すべてつなげると

```powershell
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実行ファイルが存在するフォルダの指定方法に従って設定の{}で囲まれた部分に

```json:settings.json
    "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ウィンドウを表示させる方法は[こちら](http://ikesan009.sakura.ne.jp/2017/07/11/【新】bash-on-ubuntu-on-windowsでwindows上にlinux環境を導入する/)。
　他の方法としては Windows 側に Ubuntu と全く同じRubyバージョンをインストールし、そのgemとしてrubocopをインストールする方法が考えられる。Windows環境では[pathを自力で通す](https://www.rubylife.jp/install/install/index3.html)などすればrbenvなどを用いずと複数バージョンのRubyが比較的簡単に共存可能である。上記の通りruby-rubocopのpath設定を行えば通常通り実行可能である。
　拡張機能ruby-rubocopは[個人により制作された](http://misogi.hatenablog.jp/entry/2015/12/16/223439)拡張機能である。Windows Subsystem for Linux の Ubuntu上でネイティブに使いたいのであれば、いっそのこと[公開されているソースコード](https://github.com/misogi/vscode-ruby-rubocop)をもとに自力で拡張機能を製作するのが一番良い方法かもしれない。

# 参考文献
- [ruby-rubocop](https://marketplace.visualstudio.com/items?itemName=misogi.ruby-rubocop)
- [Railsチュートリアル用の環境をローカルマシン（Windows10）上に作る](https://qiita.com/tkms0106/items/9d53ebf8774a1c1a42e9)
- [VSCodeのruby-rubocopでexecutePathがエラーになる](https://qiita.com/t2kojima/items/a74da09c33586748f03f)
- [VSCode + WSL](https://qiita.com/remin/items/b764036e95a13075ee98)