Windows11でGo言語開発環境構築　～WSL2+Docker+VSCode+Remote Developmentを添えて～

## はじめに

この記事は「[Qiita Advent Calendar 2023 Go言語](https://qiita.com/advent-calendar/2023/go)」の20日目の記事です


## ゴール

Windows11上でGo言語で開発したHello Worldアプリケーションをexeとして他の方に使ってもらえる形を目指します

## 全体の流れ

1. WSL2 のインストール
1. Ubuntu の初期設定
1. Windows Terminalの設定
1. Docker のインストール
1. VSCode のインストール
1. WSL から VSCode を起動する
1. Go 開発環境を構築する
1. VSCode拡張の自動インストール
1. Gitのインストール
1. Goアプリケーションのビルド

## WSL2 のインストール

1. 管理者権限でターミナルを開く
1. `wsl --install` を実行する
    1. デフォルトだと Ubuntu がインストールされる
3. インストールが完了したら、PCを再起動する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/962f5ce3-79cc-25e5-b0d2-700451af18d1.png)

4. `wsl --version` でバージョン情報が出てきたらインストール成功

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/cf1e7997-9b93-f50b-d144-c846369a7a2a.png)

## Ubuntu の初期設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/d13a3fba-dacb-e33d-40b8-42299b6b1a5c.png)

1. Ubuntu を起動する
1. ユーザー名とパスワードを入力してログインする
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/b13969f3-8629-a832-e2d0-71900f87aa2f.png)

3. パッケージを更新する

```bash
sudo apt update && sudo apt upgrade
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/7caead05-59b8-12a3-064f-e11852c1efd2.png)

## Windows Terminal の設定（任意）

1. Ubuntu のターミナルを既定のプロファイルにする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/923ebf4e-67cb-c0bc-6f07-454b101eefa4.png)

## Docker のインストール

1. [公式](https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository)のスクリプトを実行

```bash
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/40fbe9f5-0ca8-0d6c-9ee3-111b0d337d78.png)

```bash
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/d4c378d0-3eb8-4369-a2c9-397d100ecb7f.png)

2. ログインユーザーでDockerを動かせるように、ログインユーザーをdockerグループに追加

```bash
sudo usermod -aG docker $USER
```

3. 動作確認用Dockerを動かす

```bash
sudo docker run hello-world
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/484d9410-8dc7-6e47-f16e-cbc9cf718113.png)

4. Ubuntuのターミナルを閉じて、PowerShellからWSLを落とす

```powershell
wsl --shutdown
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/715ab081-e948-c2f1-c806-cbfb8c340e9c.png)

5. もう一度、ターミナルでUbuntuタブを開くとWSLが立ち上がる

## VSCodeのインストール

1. [公式](https://code.visualstudio.com/download) からWindows用 VSCode をインストールする
2. [Remote Development](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack) (ID: `ms-vscode-remote.vscode-remote-extensionpack`) をVSCodeの拡張機能からインストールする
（「Remote Development」は「Dev Containers」を含んだ拡張機能パック）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/2334fd08-3a7d-880d-feed-54ed1397da29.png)

## WSL から VSCode を起動する

1. 開発を行いたい任意のディレクトリを作成して、**WSL** から VSCode を起動する
※ Windows上のディレクトリ（ `/mnt/...`）を開いていると、Dockerの構築でパスがWindowsの方を見に行ってしまうので、Ubuntu管理下のディレクトリで作業する

```bash
mkdir mmd
cd mmd/
code .
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/0fd0bb7c-d8d1-33ed-b87a-5d3a6d064922.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/a1a0b2be-b21e-081a-66cd-450618e068e5.png)


## Go 開発環境を構築する

1. （念のため上で開いたVSCodeからそのまま作業をすすめる）
1. コマンドパレットから `dev add` で開発コンテナー構成ファイルを追加する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/f10c2486-d132-2ff1-bfb8-36d84f124b3f.png)

1. Go は最初のピックアップされた定義には含まれていないので、「すべての定義を表示」を選択する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/a063d632-f883-ad94-2982-2b2d5ca77795.png)

1. すべての定義を表示すると Go 定義が選べるようになる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/43499a03-7c40-aada-8c75-95aa6a2bfb42.png)

1. 既定の最新バージョンを選ぶ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/80d38f00-406d-87a3-7a43-261459ae42ed.png)

1. 機能の選択は一旦何も選択しないで「OK」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/d201776e-c452-51bc-6376-98fd0a59d885.png)

1. 「コンテナーで再度開く」を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/df9ffdfd-13a6-cb48-0b3f-92d83fefaf72.png)

1. 右下のメッセージが消えてしまった場合には、コマンドパレットで「コンテナーでリビルドして再度開く」を選ぶ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/12c2ee83-b561-1dc1-a193-8740aa18f56b.png)

1. 構築完了

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/df809480-5568-af15-21f5-928b52a6f307.png)

## VSCode拡張の自動インストール

好きなVSCode拡張機能があれば、自動でコンテナー構築時に入るよう、`.devcontainer/devcontainer.json` の customizations に拡張機能IDを追加する
（下記は私の例）

```json
	// Configure tool-specific properties.
	"customizations": {
		"vscode": {
			"extensions": [
				"golang.go",
				"mhutchie.git-graph",
				"streetsidesoftware.code-spell-checker",
				"usernamehw.errorlens",
				"oderwat.indent-rainbow",
				"mechatroner.rainbow-csv",
				"shardulm94.trailing-spaces"
			]
		}
	}
```

## Git のインストール

1. [Git for Windows](https://gitforwindows.org/) もしくは [GitHub Desktop](https://desktop.github.com/) をインストールする
1. 適当なリポジトリをcloneして、Gitの認証を通す
1. WSLに Git をインストール

```bash
sudo apt-get install git
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/6c549f56-f5ae-afc9-e33b-d4ae58b2c9c9.png)

2. Git構成ファイルのセットアップ

```bash
git config --global user.name "Your Name"
git config --global user.email "youremail@domain.com"
git config --global credential.helper "/mnt/c/Program\ Files/Git/mingw64/bin/git-credential-manager.exe"
```

3. Windowsで認証を通していれば、WSL側で個別に認証を行わなくてもgitコマンドが使えるようになる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/c69158f6-bf5d-c758-fa7c-f5be21e3aeca.png)

## Goアプリケーションのビルド

1. go.mod を作成する

```go
go mod init github.com/<Githubアカウント名>/go_hello
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/a97e4fad-c128-534d-7f1b-7fd0be27a2db.png)

1. main.goを作成する

```go
package main

import (
	"fmt"
)

func main() {
	fmt.Println("Hello World!")
}
```

2. `go run .` で起動を確認する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/bd50cac1-70d7-1639-e11f-3bb7c5eb1ee3.png)

3. Windows 用に exe としてビルドする

```go
GOOS=windows GOARCH=amd64 go build main.go
```

4. 出来上がったexeをコマンドプロンプトから実行する（pauseとか入れてないので）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254327/1002be86-2038-93dc-bb1a-f9028ce5edd8.png)

## おわりに

これでGo言語での開発ができるようになりました！
これから色々と遊んでいきたいと思います。

Merry Christmas & Happy New Year !!!

## 参考URL

- [Windows11+VSCode+Dev ContainersでGo言語開発環境構築](https://blog.final-techblog.com/windows11vscodedev-containers%E3%81%A7go%E8%A8%80%E8%AA%9E%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89)
- [WSL を使用して Windows に Linux をインストールする方法](https://learn.microsoft.com/ja-jp/windows/wsl/install#step-4---download-the-linux-kernel-update-package)
- [Ubuntu on WSL2でのDocker Engineの最短インストール手順](https://qiita.com/nujust/items/d7cd395baa0c5dc94fc5)
- [WSL(Ubuntu)にDocker環境を構築する](https://zenn.dev/thyt_lab/articles/fee07c278fcaa8)
- [Ubuntu on WSL2でのDocker Engineの最短インストール手順](https://qiita.com/nujust/items/d7cd395baa0c5dc94fc5)
- [Windows への Visual Studio Code のインストール方法](https://www602.math.ryukoku.ac.jp/Prog1/vscode-win.html)
- [【WSL / WSL2】VSCode×WSLでWindows上にLinux開発環境を構築](https://qiita.com/_masa_u/items/d3c1fa7898b0783bc3ed)
- [WindowsのWSLのみでDockerを動かし、Dockerデーモンを常駐させ、VS Codeからコンテナを開く](https://teachme.jp/90980/manuals/19146802)
- [AWSを用いたGoの開発環境構築でWindowsユーザがMacユーザに歩み寄るナレッジ](https://qiita.com/ma91n/items/3ec2538fbfe2577b54b1)