😇

Windows上のVSCode workspaceファイルからRemote WSL環境に直接入る際のメモ

2024/04/10に公開

要約

remoteAuthorityプロパティでリモート環境を指定した.code-workspaceファイルではGitのpath設定が適切にできなかったため、バッチファイルで無理やり解決しました(力技)

やりたいこと

WSL経由で複数の開発フォルダを見る設定のworkspaceに、Windows環境から一発で入るのがゴール。
もちろんWSLに入ってからそのようなworkspaceファイルを開けば済むものの、一度WSLに入らなければいけないという一手間をどうにか省いてWindows環境からワンクリックで一足飛びできないかという話。

参考になりそうな記事

https://qiita.com/tom-zoo/items/75fd6c9bcd6fc8f2c998
通常のworkspaceファイルと明確に異なる点として、

"remoteAuthority": "wsl+<distro name>",

といった形式のプロパティを追加すること(<distro name>は各々のWSL環境に合わせて埋める)。このプロパティ自体ググっても情報はあまり出てこないが、
https://github.com/microsoft/vscode/issues/118023
で取り上げられているように、飛びたい先の環境がSSHやDevContainersなどでもダイレクトに行くことができる。

問題点

実際に上記の記事にあるような設定を書いた.code-workspaceファイルをWindows環境からクリックすると、WSL環境に入った上で所望のworkspaceを開いたVSCodeのウインドウを得られる。
……が、ここでサイドバーのSource Controlを確認すると何故かgitのstatusが反映されておらず、initializeせんかい!と言われてしまう。色々と確認していくと、

  • WSLに一度入ってから同様のフォルダ構成のworkspaceを開くと、Source Controlは既存のgit statusを取得できる
    • このとき実行されているgitのバイナリはWSL内のもの
    • もちろんwhichコマンド等でgitのフルパスを確認するとWSL内のそれが示される
  • Windows上にgitがあり、remoteAuthorityプロパティを削除したworkspaceファイルを開いてWindows環境でのworkspaceウィンドウを得た場合、Source Controlは既存のgit statusを取得できる
    • このとき実行されているgitのバイナリはWindows上のもの
  • Remote(WSL)レベルのSettingsにはgit pathを指定するプロパティが用意されているが、下位のworkspaceレベルにはそのプロパティがない
    • なのでworkspaceファイルのsettingsにGit.path:"~"というプロパティを追加しようとしても打開策にはならない(Color Highlightがonの場合はグレーアウトするかも)

remoteAuthorityプロパティについて

何だかおま環のような気もしつつ、とりあえず先のissueをもう少しちゃんと見ていくと、
https://github.com/microsoft/vscode/issues/118023#issuecomment-789546698
とあり、どうやらリモート用のworkspaceをローカルに保存すること自体当初は想定されていなかったらしい。
先程書いた通りSSHやDevContainersと並列でWSLが扱えるプロパティなので、まあWindows環境にWSLの諸々を書くことも当初の設計には入っていなかったのかもしれず、おそらくSettingsにあるようなプロパティのチグハグ具合に繋がるのではないか……。

結局どうしたか

.code-workspaceからではどうにもならなさそうだったので、バッチファイルを用意した。
https://code.visualstudio.com/docs/remote/wsl#_from-the-windows-command-prompt
上記の例に沿って、

code --remote wsl+<distro name> /your/wsl/path/to/hogehoge.code-workspace

と書かれたバッチファイル(パスは各々の環境に合わせて)を実行すれば、WSL環境でgit周りがおかしなことになっていないworkspaceを開くことができた。

本質的な問題(リモート/ローカルとworkspace絡みの不一致)は解決していないのでバッドノウハウ感があるものの……とりあえず動いたのでヨシ!

Discussion