2022年の今更Windows10+WSL2(Ubuntu)で開発環境を整えてみる

# 背景

普段はMacbook Proを開発に使ってるんですが、自宅にあるWindowsでもいろいろ作りたいものが出来てきたりしたので、そういえばWSLってなんか良いらしいなーというのを思い出したので、どれくらい実用に堪えるのかを検証してみたくなった感じです！

実はこれを書く前日に、夜なべしてWSL+Debianで環境構築してNeoVimのインストール時点で死ぬほど大変な思いをしたので、今回はもうちょっと一般的に使われているであろうUbuntuを利用して環境構築してみました。

結論からいうと同じDebian系でもUbuntuの簡単さは破格でした…。というお話です。

あまりに簡単すぎて、あんまりおもしろいことは書けなかったのですが、個人的なメモがてら手順はまとめておきたいのも含め書いてます。

# とりあえずWSLを入れる

## の前に、Windows Terminalを入れる

今だとWindows Terminalがとても使いやすいので、それをまず入れましょう。
[Windows Terminal を入手 - Microsoft Store ja-JP](https://www.microsoft.com/ja-jp/p/windows-terminal/9n0dx20hk701?activetab=pivot:overviewtab)

普通にインストールできるはずなので、次はWSLを使えるようにします。

## WSL2を利用できるようにする

Windows Terminal(スタートメニューでterとか入れると補完が効くので便利)を起動します。
デフォルトだとPower Shellが起動すると思うので、そこで早速下記コマンドを実行。

```powershell
wsl --install
```

次に、WSLはデフォルトで2を使うようにしたいので、下記コマンドを叩いておきます。

```powershell
wsl --set-default-version 2
```

これでディストリビューションをインストールした際のデフォルトのバージョンが2になります。
これをやっておかないと後でコンバートする羽目になって非常にめんどくさいです 😫

# Ubuntuをインストールする

ディストリビューションは正直何にしようか迷ったのですが、冒頭で記載した通り情報が圧倒的に多そう＆サポートも手厚そうなのでおとなしくUbuntuにしておきます(Debianの時は情報が少なくて大変だったので)。

まずはどんなものがインストールできるのかを確認します。

```powershell
wsl --list --online
インストールできる有効なディストリビューションの一覧を次に示します。
'wsl --install -d <Distro>' を使用してインストールします。

NAME            FRIENDLY NAME
Ubuntu          Ubuntu
Debian          Debian GNU/Linux
kali-linux      Kali Linux Rolling
openSUSE-42     openSUSE Leap 42
SLES-12         SUSE Linux Enterprise Server v12
Ubuntu-16.04    Ubuntu 16.04 LTS
Ubuntu-18.04    Ubuntu 18.04 LTS
Ubuntu-20.04    Ubuntu 20.04 LTS
```

Ubuntuがたくさん出てきますが、バージョン無しのUbuntuはどういうことなのでしょう？
こちらが詳しいです

[WSL-Ubuntu Wiki](https://wiki.ubuntu.com/WSL)

Google翻訳すると

> [Ubuntu](https://www.microsoft.com/en-us/p/ubuntu/9nblggh4msv6)（リリースバージョンなし）は常に推奨リリースに従い、最初のポイントリリースを取得したときに次のリリースに切り替えます。現在、Ubuntu 20.04LTSがインストールされています。
> 

とのことなので、まぁあまり気にせずバージョン無しを選んでおいても損はないよってことみたいです。

というわけでインストールしましょう。

```powershell
wsl --install -d Ubuntu
```

Ubuntuのウィンドウが別で開くので、ユーザ名とパスワードを入力します。
うまくいけばbashが立ち上がり、インストールが完了します。このウィンドウはいったん閉じて大丈夫です。

次に、インストールされたUbuntuがちゃんとWSL2で動いているのかを確認します。

```powershell
wsl -l -v
  NAME      STATE           VERSION
* Ubuntu    Running         2
```

`VERSION`が `2` となっているので大丈夫そうです！

## Windows Terminalから起動できるよう設定する

いったんWindows Terminalを再起動させます。そうしないと今インストールしたUbuntuが候補に入りません。

Windows Terminalを開き、設定を開きます( `Ctrl+,` でもいけます)。

1. スタートアップ → 規定のプロファイルで `Ubuntu` を選択、起動サイズをお好みで。
2. プロファイル → 規定値 → 外観タブ → ポインターをアンダースコア ( `_` )に。
3. プロファイル → Ubuntu → 全般タブ → 開始ディレクトリを `\\wsl$\Ubuntu\home\[Ubuntuユーザ名]` としておきます。これで起動時のデフォルトパスが自身のホームディレクトリになります。
4. プロファイル → Ubuntu → 外観 → 配色で好きな色に(僕は `Solarized Dark` をカスタムして使ってます(カスタムはウィンドウ左下のJSONファイルを開くってところから既存のをコピーするとやりやすいです)
5. 最後に忘れずに右下の保存ボタンをクリック

終わったらWindows Terminalを再起動してみましょう。

Ubuntuから始まり、色やホームディレクトリなどの設定が反映されていればOKです。

# 開発に必要なソフトウェアを入れる

ここからは個人的に絶対必要なソフトの導入や設定をしていきます。

まず最初にお約束の `apt update` と `apt upgrade` をしておきましょう

```bash
sudo apt update
sudo apt upgrade -y
```

## zsh導入

とりあえずシェル回りを快適にしないと何をするにもしんどいので、zshから入れていきます。

これはそんなにバージョンにこだわりがないので普通にaptから入れてしまいます。

```bash
sudo apt install zsh
```

それからデフォルトシェルになるよう設定します。

```bash
which zsh # => /usr/bin/zsh
chsh -s /usr/bin/zsh
```

一度Windows Terminal側のタブを落とし、再度Ubuntuを開くと、zshの初期メニューが出てzshが使えるようになるはずです。

### .zshrcの設定

これは各々好みがあると思うので、設定しておきましょう。

## tmux導入

これも無いと困るのでインストールしておきます。
特に最新版を求める必要もないと思ってるので、素直にインストールして設定します。

```zsh
sudo apt install tmux
```

## gitの最新版をインストール

下記でOKです

```bash
sudo add-apt-repository ppa:git-core/ppa
sudo apt update
sudo apt upgrade
```

## NeoVimのインストール

つい先日(昨日)Debianで入れようとした時は死ぬほど苦労したんですが…。

```bash
sudo add-apt-repository ppa:neovim-ppa/unstable
sudo apt-get update
sudo apt install neovim/focal
```

Ubuntuだとたったこれだけで終わりです。さすがです。
世の中はUbuntuを中心に回っている…。

ついでに `.config` 内に設定用のディレクトリを作成しておきます。

```bash
mkdir -p ~/.config/nvim
```

### VimPlugの導入

公式の通り、簡単。

[GitHub - junegunn/vim-plug: Minimalist Vim Plugin Manager](https://github.com/junegunn/vim-plug#neovim)

```bash
sh -c 'curl -fLo "${XDG_DATA_HOME:-$HOME/.local/share}"/nvim/site/autoload/plug.vim --create-dirs \
       https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'
```

あとは適当にVimPlugの設定を `~/.config/nvim/init.vim` に書いて、 `:PlugInstall` で一括インストールして終わりです。

## asdfの導入

asdfは、 `〇〇env` 系のバージョン管理をさらにひとまとめにした、いうなれば `anyenv` みたいなやつです。最近イケてそうなのでこちらも導入しておきます。

こちらも公式サイトが詳しいです。

[Getting Started | asdf](http://asdf-vm.com/guide/getting-started.html#_1-install-dependencies)

が、インストールはめちゃくちゃ簡単で、gitでcloneして `.zshrc` に追記するだけです。

```zsh
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.9.0
```

`~/.zshrc` に追記

```zsh
# asdf
. $HOME/.asdf/asdf.sh

# append copletions to fpath
fpath=(${ASDF_DIR}/completions $fpath)
# initialise completions with ZSH's compinit
autoload -Uz compinit && compinit
```

では、試しにnodejsをインストールしてみます。

asdfにプラグインとしてnodejs用のプラグインを追加します。

```zsh
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git
```

その後インストールできるバージョンを下記で確認します。

```zsh
asdf list all nodejs

...
16.13.1
16.13.2
lts-gallium
lts
17.0.0
17.0.1
17.1.0
17.2.0
17.3.0
17.3.1
17.4.0
```

せっかくなので新しい `17.4.0` を入れてみます。

```zsh
asdf install nodejs 17.4.0 # バージョンは `latest` としてもよい。

Cloning node-build...
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
        LANGUAGE = "ja_JP:jp",
        LC_ALL = "",
        LANG = "ja_JP.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
Downloading node-v17.4.0-linux-x64.tar.gz...
-> https://nodejs.org/dist/v17.4.0/node-v17.4.0-linux-x64.tar.gz
Installing node-v17.4.0-linux-x64...
Installed node-v17.4.0-linux-x64 to /home/m-yamashita/.asdf/installs/nodejs/17.4.0
```

globalに利用するバージョンを指定して実行してみましょう。

```zsh
asdf global nodejs latest
node -v

v17.4.0
```

簡単！

## Docker

Docker公式に、Ubuntu専用のページがあって丁寧に解説されているので、このままやれば基本的にはOK。

[Install Docker Engine on Ubuntu | Docker Documentation](https://docs.docker.com/engine/install/ubuntu/)

まずはupdateと依存関係のインストール

```zsh
sudo apt-get update
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
```

Docker公式のGPGキーを追加

```zsh
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
```

リポジトリ追加(これはStable用)

```zsh
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
```

再度updateの後、インストール

```zsh
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
```

サービスを立ち上げた後、実行

```zsh
sudo service docker start
sudo docker run hello-world

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:507ecde44b8eb741278274653120c2bf793b174c06ff4eaa672b713b3263477b
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
```

正常に実行できた！👏

# 感想

WSL、Debianとかだとめっちゃハマりどころがあったんですが、Ubuntuだと何もかもすんなりで楽勝でした。

かなりシームレスにWindowsと融合して使えるので利用の幅が広いし、ちゃんとWSL内ではWindowsらしからぬ綺麗なフォントが再現されておりLinux使ってる感覚にかなり近いと感じた。

VSCodeとかGUIのIDEやらエディタ使いたいなってなっても、元々Windowsが外にいるため、そういうのは普通にWindowsにインストールしておけばいいし、WinからUbuntu内のディレクトリへもアクセスが簡単にできる為、いろいろ柔軟にできそう。

もう少しちゃんと使うと困ることも出てくるのかもしれないが、基本的にはほぼ問題なく快適な開発環境が手に入るなーって印象でした！