リモート開発、便利ですよね。今回はWindows 10 HomeなPCに乗り込んで開発するという内容で記事を書いてみたいと思います。
想定読者
この記事はこんな方に向けて書いています。
ぼくはDellのG5 5000というゲーミングPCを開発環境として使っていて、先月も増設用のメモリなどを買ったところなんですが、これをリモート開発に使用したい!だけどOSがWindows 10のHomeエディションといういかんともしがたい状況なのです。
追記20230112:やっぱり駄目でした
どうもやはりssh-agent周りが厳しく、期待通りとはいきませんでした。ほかにやり方考えます。
背景
そもそもなぜリモート開発をしたいかというと、
- どこからでも1つの環境に乗り込んで手慣れた環境で開発をしたい
- かといって軽いノートパソコンではスペックが足りない
- あんまりヘビー(物理)なマシンを持ち歩きたくない
などなど、皆様様々な理由があると思います。自分もインタプリタ系の言語でツールを書いているうちは試行錯誤に時間がかかるので問題にはならないんですが、TypeScriptなどトランスパイルを挟む言語だったり強力な補完を効かせたい言語で開発を行っているとなかなかにストレスが溜まってきます。
補完なんて使わずにメモ帳でも書けて、試行錯誤も1回で済むスーパーマンであればそういったストレスも少なくて済むのでしょうが、ぼくはゴリゴリにトライアルアンドエラーを繰り返して物を作っていく人間なのでそうはいきません・・・
リモート開発環境候補
ここに至るまでに考えた(試した)ものを記載します。
1. リモートデスクトップ(VNC, RDP, TeamViewer)
VNCやRDPを通して開発するという方法です。GUIを使う方法でネットワークの帯域は必要になりますが、ローカルネットワークであれば快適に開発できます。
「パワーで解決」という感じなので、ネットワークなどの環境に左右されがちなのが難点でしょうか。これがどんなところでも快適にできる未来が来るといいですね。
また、RDPを使うにはWindowsのProライセンスが必要になるので、使える人は限られるのではないかと思います。(自分が開発に使用しているゲーミングPCもHomeライセンスです)
2. Visual Studio Code のリモート開発機能(Linux)
???「SSHでよくね?」
はい、昔ながらの方法、「SSH経由でVIM」。これが最強です
・・・ではなくて、最近はVisual Studio Codeのリモート拡張機能を使うとVSCodeの言語サーバー(補完などを提供するサーバー)をリモートで動かしつつ手元に表示して開発することができます。
おお、それなら無料で使えるOracleCloudのARMインスタンスを使ってみてはどうか?ということで、VSCodeのリモート機能で乗り込んで開発してみました。(ARMインスタンスは普段以下のような使い方をしています。)
が、やはりゲーミングPCのパワーは強く、見劣りするなぁというのが正直な感想です。まぁ使えなくはないんだけど…
3. Visual Studio Code のリモート開発機能(Windows)
実はVisual Studio Codeのリモート機能にはSSHでWindowsにも乗り込むことができます。
「エーWindowsでSSH?」と思われる方もいるかもしれませんが、Windows 10には、とあるバージョンから「OpenSSHサーバー」をオプション機能としてインストールする機能が備わっていますので、簡単にSSHを導入できるのです。
実際に使ってみると、デスクトップPC内で作業しているような快適さでリモート開発できることがわかると思います。
Visual Studio Codeを使用したWindowsでのリモート開発の問題
というわけで、ここまで試してきた中でリモートのゲーミングPC(Windows 10 Home)にSSH経由でVSCodeで乗り込むという方法で快適なリモート開発環境が構築できました。これでしばらくは問題なく開発することができていたんですが・・・
しかし、これにも問題が…
一番目はターミナルでSSHしている場合は普通にgit pullできるのでVSCode拡張機能側の問題で、二番目はdevcontainerの拡張機能がWindowsに対応していない(/etc/passwdとか参照しようとしてコケてる)というのが問題です。
Windowsでリモートはやはりマイナーなのか・・・
これについてはLinux互換の何かを動かせばよいので方法は複数考えられて、
- VirtualBox など VMを立てる
- WSL2 の Linux に SSHサーバーを立てる
- デフォルトシェルをWSL2にしてみる
などがあります。が、1つ目はリソースをフルに活用できない問題、2つ目はWindowsとWSLでは内部で異なるIPアドレスになっているのでフォワーディングが別途必要になるなどから、今回取ってみるのは3つ目のWindowsのデフォルトシェルをWSL2のbashにしてみるという作戦です。
解決手順
解決は以下の3ステップです。
デフォルトシェルをWSL2のbashにする
まずはリモートで乗り込む先のWindowsマシンのデフォルトシェルをWSLのbashに変えてしまいます。サーバーにログインした後、レジストリエディタで HKEY_LOCAL_MACHINE\SOFTWARE\OpenSSH
に DefaultShell
という名前で C:\Windows\system32\bash.exe
という値の文字列を登録します。
PowerShellで行う場合は以下の通り。
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\system32\bash.exe" -PropertyType String -Force
参考: OpenSSH Server configuration for Windows | Microsoft Learn
VSCode Remote SSH の設定を「Linux」に
これでデフォルトシェルがWSLのbashになったので、VSCode側のリモート接続設定を Linux
にしましょう。
設定の "remote.SSH.remotePlatform"
の値を ホスト名: "linux"
という形式で記載します。
{ "remote.SSH.remotePlatform": { "hogemachine": "linux" } }
このようにすることで、対象マシンがLinuxマシンと判断され、VSCodeもsh前提の動作をしてくれるようになるようです。
Windows設定のままだと以下のようなエラーが出てしまいます。PowerShellとかcmdとか探そうとしてしまうみたいですね。
[10:40:38.083] "install" terminal command done
[10:40:38.083] Install terminal quit with output: ]0;C:\Windows\System32\cmd.exebash: powershell: command not found
[10:40:38.083] Received install output: ]0;C:\Windows\System32\cmd.exebash: powershell: command not found
[10:40:38.084] Failed to parse remote port from server output
WSL2内でのdockerの設定を変える
何が原因なのかはわかっていませんが、devcontainerを使用しようとすると以下のようなエラーが出ました。
[2023-01-10T14:30:09.008Z] => [internal] load build definition from Dockerfile.extended 0.0s => => transferring dockerfile: 3.30kB 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => ERROR resolve image config for docker.io/docker/dockerfile:1.4 1.0s ------ > resolve image config for docker.io/docker/dockerfile:1.4: ------ ERROR: failed to solve: rpc error: code = Unknown desc = failed to solve with frontend dockerfile.v0: failed to solve with frontend gateway.v0: rpc error: code = Unknown desc = error getting credentials - err: exit status 1, out: `error getting credentials - err: exit status 1, out: `A specified logon session does not exist. It may already have been terminated.``
どうもcredentialsを取得しようとしてるときにエラーが発生しているようなので、設定ファイルを見てみます。
{ "credsStore": "desktop.exe" }
desktop.exe
とか怪しすぎるので、適当に無効な設定にしてしまいます。
{ }
これで再度devcontainerで開いてみて無事ビルドが通ればOKです。
終わりに
以上、開発環境構築記事でした。Windowsにリモートで乗り込んで開発したいとかいう珍しい方がいらっしゃったら参考になれば幸いです。