Chapter 03

WSL2に即したJetBrains製IDE、Git、Docker、開発サーバの注意点

SHIBUKAWA Yoshiki
SHIBUKAWA Yoshiki
2021.01.29に更新

間違った使い方をした場合の影響

現代の開発環境は開発者に多くのアフォーダンスを与えるべく、大量の情報を収集します。例えば、IDEはプロジェクトのファイルだけではなく、プロジェクトが参照しているファイルまで広範囲にファイルを解析し、インデックス化してエラーチェックや補完に利用します。またDockerはイメージ作成時に、ローカルのファイルをコンテキストとしてDockerサーバーに転送します。Webフロントエンドの開発サーバーはローカルのファイルの変更の検知を行って自動で再ビルドを行います。動的にリロードしたりモジュールを置き換える機能を持つものもあります。Gitもローカルのファイルをスキャンして変更を検知します。

前章では、Windows側のファイルシステムを作業フォルダにしてWSL2を使ったり、WSL2のフォルダでWindowsアプリを利用する場合、9Pプロトコルによるファイル転送が行われてパフォーマンスが落ちることは紹介しました。

IDEの場合、補完が行われるまでのインデックスに時間がかかりますし、インデックスができても、何かとキーボード操作に対して応答速度が下がります。Dockerもビルドに時間がかかるようになりますし、変更を検知しての再ビルドも、応答速度やビルドそのものの時間が極めて遅くなります。

2021/01/29更新

  • 2021.1のアーリーアクセス版でWSL2サポートがスタートしました。まずは第一歩としてSDKとしてWSL2の中のLinux版JDKが選べるようになるようです。VSCodeのように起動時の場所を検知してモードが変わったりとか、IntelliJ以外の他の言語についてはまだアナウンスされていませんが、徐々に改善はされていくでしょう。

https://blog.jetbrains.com/idea/2021/01/intellij-idea-2021-1-eap-1/

対処法

WindowsとLinuxを極力混ぜなければ問題は発生しません。

原則として、WSL2を開発環境に選ぶのであれば、作業フォルダはこれの中に作ります。Windowsフォルダを選んではいけません。

問題なのはIDEなどのGUIツールです。GUIはWindowsネイティブで動くものを選びたくなるでしょう。しかし、例えばJetBrainsのIDEはこれまで説明してきた問題にもろに引っ掛かります。issueも立っています。

例外はVisual Studio Codeで、WSL2のファイルシステムの中に入り込んでLinux用のワーカーを使って動作します。VSCodeは実行環境がWSL2であることを検知して起動します。WSL2のbash上でcode .のように起動しても、Windows版のエディタウインドウが起動します。また、ダイアログの左下にはWSL環境で起動している旨が表示されています。

これはRemote-Development機能によるものです。この機能はDocker内部で作業を行ったり、SSHでリモートのホスト上のコードを編集したり、GitHub Codespaceなどのリモート環境での開発を実現する機能を流用したもので、WSLとホスト間で似たようなことを行います。

JetBrains製のIDEを捨てなければならないかというと対処方法はあります。Linux版のIDEを利用することです。

Linux版は.tar.gzで圧縮されているため、WSL内部の適当なフォルダに展開します。次に、Xサーバーをインストールします。VcXsrvを使うと無料でできますが、優良のストアアプリもあります。

VcXsrvのインストールは次のページに書かれています。

VcXsrvのインストールを行ったら、Xlaunchを起動します。次のオプションでインストールします。

  • 最初のページ
    • Multi windows(デフォルト値)
  • 次のページ
    • Start no client
  • 3つ目のページ
    • Disabel access controlを設定、
    • 追加のオプションでは-acを追加
  • 最後のページ
    • 適当なところに設定ファイルを保存

最後に保存したファイルは${HOME}\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startupに放り込んでおきます。

最後に、WSLの.bashrcにXServerの場所を教えてあげれば完了です。

export DISPLAY=$(ip route  | awk '/default via / {print $3; exit}' 2>/dev/null):0 export LIBGL_ALWAYS_INDIRECT=1 

これで再起動のたびに自動でXサーバーが起動します。DISPLAYが適切に設定されたら、展開したGoLandなどのIDEのフォルダのうちの、bin/goland.shなどのファイルを起動したら、次のような画面が表示されます(本当の最初はGoLandのライセンス認証ですが)。

uimなどの設定を作り込めば日本語入力もできるようになるようです。

まとめ

WSL2のパフォーマンス劣化を避ける方法を紹介してきました。

  • DockerやWSL2のプログラムがコードを実行したりビルドする場合、作業フォルダはWSL2上に用意する
  • WSL2上の開発環境はVisual Studio Codeを利用する
  • どうしてもGoLandやIntelliJやWebStormなどを使いたい場合はLinux版のバイナリを利用する方法もある

場合によっては、ソースコード互換性さえあれば良いというのであればMinGWやCygwinを使う方法もあります。開発するアプリケーションの特性や規模によっても最適解は変わります。