しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Windows / Visual Studio 使いが WSL 2 / Visual Studio Code で環境構築した時の手順

基本的には Windows と Visual Studio を使って Azure Functions や GitHub で公開しているアプリケーションとライブラリを書いていますが、最近は Python や Go を書く必要がちょいちょい出てきたので、色々と観念して WSL 2 の環境を構築して使っています。

特に Python は Azure Functions だと Linux のみ対応となるので、Windows 上での開発は難しくなっています。他にも個人的に PR を投げている Terraform Provider for Azure も Windows 上では一部のテストが通らなくなっているので、WSL 2 を使わないと難しい状況です。

環境構築系はメモっておかないと後ではまるので、自分が必要な範囲で手順を残します。

Azure 開発に必要なパッケージと C# / Node.js は WSL 2 に直接インストールしますが、Python や Go などは基本的に VS Code の Dev Container 経由で使うという割り切った構成にしています。

ちなみにメインマシンは Windows と Visual Studio 専用にしているので、この間購入した Tiger Lake NUC 上に WSL 2 と Visual Studio Code の環境を構築して、必要な時にリモートデスクトップで使っています。

自宅の NUC は有線で繋いで常時稼働させているので、こういった用途には適しています。

基本的な WSL 2 環境構築

Visual Studio Code と Remote 拡張をインストール

ほとんどの人が Visual Studio Code をインストールしていると思うので、このセクションはほぼ不要な感じがありますが、同時に Remote 拡張は必要なので一応書いておきます。

Remote Development Extension Pack をインストールすれば、SSH / WSL 2 / Container 向けのリモート開発が可能になります。これが無いと始まりません。

WSL 2 のインストールと設定

最近は Docs にしっかりとしたドキュメントが揃っているので、WSL 2 のインストールは書いてある手順通りに再起動しつつ行えば問題ないです。再起動と書いてあるタイミングで行っておかないとはまります。Insider Preview だと簡単らしいですが、今のところは個別に設定が必要です。

WSL 2 のデフォルト設定のままだと若干使いにくい部分があるので、設定を Windows と WSL 2 のそれぞれで追加して改善します。設定のリファレンスは Docs にあります。

Insider Preview では改善されているらしいですが、デフォルトだと WSL 2 の VM がメモリを食いつくしてしまったので、%USERPROFILE%\.wslconfig を作成して WSL 2 へのメモリ割り当て上限を追加しました。

[wsl2] 
memory=16GB

NUC は 32GB のメモリを積んでいるので半分を割り当てるようにしました。

もう一つは WSL 2 側に Windows の PATH が自動的に追加されてしまう件ですが、これは WSL 2 側で /etc/wsl.conf を作成して、追加しないように変更しました。

[interop]
appendWindowsPath=false

結構この挙動で混乱することが多かったので、WSL 2 と Windows は切り離しておきます。

このままだと VS Code の Remote 開発に影響が出るので code に対して alias を追加して対応しました。

alias code="/mnt/c/Users/shibayan/AppData/Local/Programs/Microsoft\ VS\ Code/bin/code"

これで code . とターミナルで打てば、これまで通り Windows 側で WSL 2 のディレクトリを開けます。

Docker Desktop をインストール

VS Code で Dev Container を使うために必要なので Docker Desktop をインストールします。インストール時に WSL 2 が有効化されていると、良い感じに WSL 2 Backend も有効化してくれました。

設定画面で WSL 2 Based Engine が有効化されていることを確認しておけば OK です。

f:id:shiba-yan:20210725161237p:plain

インストール後に WSL 2 側から docker コマンドが叩けるようになっていることを確認しておきます。エラーになった場合は WSL 2 と Docker Engine の再起動で大体解決しました。

快適に利用するための設定

Windows Terminal の開始ディレクトリを変更

WSL 2 がインストールされていると Windows Terminal は自動的にプロファイルを追加してくれるので便利ですが、デフォルトでは開始ディレクトリが Windows 側の %USERPROFILE% になっているので不便です。

f:id:shiba-yan:20210726163639p:plain

Windows 側のファイルシステムを WSL 2 から参照するとパフォーマンスがかなり悪いので、基本は WSL 2 側のファイルシステムに寄せておいた方が便利です。

最初は /home/shibayan とでも書いておけばいいかと思ったのですが、Windows 上でのパスを指定する必要があるらしいので、以下のように指定しました。

\\wsl$\Ubuntu-20.04\home\shibayan

これで Windows Terminal で WSL 2 を起動すれば、常にホームから開始できます。

f:id:shiba-yan:20210725154909p:plain

パフォーマンスが良いので Node.js を使った開発が捗ります。ソースコードは GitHub に全て置いてあるので、Windows と共有はせずに WSL 2 側で clone するようにしています。

Git の認証情報を Windows 側と共有

実は意外に知られていないっぽくて少し驚いたのですが、Windows 側で Git Credential Manager を使って保存された認証情報は、設定を追加すると簡単に WSL 2 側からも利用できます。

Git Credential Manager Core が必要なので、最新の Git for Windows を入れておきます。

共有するための設定は公式ドキュメントにあるように、Windows 側の Git Credential Manager Core を WSL 2 側の Git でも使うようにするだけです。

Git のインストールディレクトリを弄っていない限りコピペで実行するだけで終わります。

git config --global credential.helper "/mnt/c/Program\ Files/Git/mingw64/libexec/git-core/git-credential-manager-core.exe"

これで WSL 2 から GitHub の MFA をクリアしつつ、SSH キーの管理無しで扱えます。かなり便利です。

開発に必要なパッケージをインストール

.NET Core / .NET SDK

C# を使った開発をメインで行っているので .NET Core / .NET SDK のインストールが重要ですが、apt には .NET 6 Preview が公開されていないのでインストールスクリプトを使うようにしています。

公式サイトから dotnet-install.sh をダウンロードして適当に実行権限を付ければ、以下のようにパラメータを渡してサクッとインストールできます。

# 最新の LTS バージョン (.NET Core 3.1)
./dotnet-install.sh -c LTS
# 最新の Current バージョン (.NET 5.0)
./dotnet-install.sh -c Current
# 最新の .NET 6.0 Preview バージョン
./dotnet-install.sh -c 6.0
# 明示的にバージョン指定可能
./dotnet-install.sh -v 6.0.100-preview.6.21355.2

$HOME/.dotnet にインストールされるので、このディレクトリを PATH に追加すれば完了です。

export PATH="$HOME/.dotnet:$PATH"

適当に dotnet --info を実行すると、インストールされている SDK が確認できます。

f:id:shiba-yan:20210725154952p:plain

Azure Functions v4 のような .NET 6 Preview が必要なアプリケーションの検証もこれで捗ります。

Node.js (nvm)

C# の次に Node.js を使うことが多いのと、Windows 上だと npm install のパフォーマンスが悪いので WSL 2 上で利用します。これも公式ドキュメントに nvm を使ったインストール方法が載っているので簡単です。

基本的に LTS を使うようにしているので、nvm で LTS バージョンである v14.x を入れています。

f:id:shiba-yan:20210726113712p:plain

.NET SDK の時のように nvm install --lts コマンド一発で入るので簡単でした。nvm インストール時に PATH は自動で通してくれたので、.NET SDK の時より手間は省けました。

Azure CLI

Azure 開発をしていると必ず必要になる Azure CLI は WSL 2 側にも入れておきます。自動インストール用のワンライナーが公開されているのでかなり簡単です。

普通はインストール後に Azure へのログインが必要ですが、WSL 2 の場合は Windows 側で Azure CLI へのログインが完了していれば、認証情報の共有が可能です。

今回は知らない間に .aws.azure へのシンボリックリンクが作成されていました。

f:id:shiba-yan:20210725155102p:plain

.azure へのシンボリックリンクが存在しない場合は、改めて手動で作れば問題ないです。

f:id:shiba-yan:20210725155112p:plain

これで WSL 2 側の Azure CLI から az login を実行することなく操作可能になりました。

Azure Functions Core Tools

Azure Functions の開発には Core Tools が必要になるので .NET SDK とは別にインストールします。npm でもインストール出来ますが、nvm との相性が悪いらしいのでドキュメントの通り apt を使って入れます。

現在、実質的にサポートされているのは v3 のみなので、間違えて古い v2 を入れないように注意します。

f:id:shiba-yan:20210725155045p:plain

Azure CLI が使えるようになっていると、Core Tools から Functions のデプロイが出来るので開発中には便利に使えます。そろそろ v4 のプレビュー版も公開されそうな気配があります。*1

Terraform CLI

Terraform Provider for Azure へちょいちょい PR を投げているのと、しっかりリソースを作成したい場合には Terraform を使うようにしているので CLI を apt を使ってインストールします。

Windows の場合は zip をダウンロードして、手動でどこか PATH の通った場所に置く必要があるので結構悩むのですが、WSL 2 だとサクッと準備できます。

f:id:shiba-yan:20210725155129p:plain

自前でビルドした Terraform Provider を使うのも WSL 2 の方が楽です。シングルバイナリで動作するので Dev Container までは流石に不要という感じです。

Speedtest CLI

WSL 2 で今のところ GUI を使いたい要求が無いので、ブラウザ不要でネットワーク速度を測定できる Speedtest CLI をインストールしています。これも公式サイトを見れば簡単にインストール出来ます。

ネットワーク速度を測定したい理由としては、WSL 2 では一部の環境でネットワーク速度が異常に遅くなることがあると知ったので、それの確認目的という感じです。

自分の環境では特にネットワーク周りの問題は発生していないので、apt を使ったインストールや Docker Image の pull / push 含めて快適に使えています。

f:id:shiba-yan:20210726164248p:plain

目的がアレなので 1,2 回使えば不要になりそうですが、コマンドでサクッと測定出来るのは地味に便利なので入れたままにしています。

*1:v4 は npm ではすでにプレビュー版が公開済み