📦

VSCode devcontainerでローカルを汚さずに、快適なGo言語の開発環境を整える

2021/01/02に公開

前提条件

本記事は以下の方向けの記事となります。
各ソフトのインストール方法などは別途記事を参考にしていただくようお願いいたします

  • エディターにVSCodeを利用している
  • Docker, docker-compose をインストールしている
  • VSCodeの拡張機能や、各種ツール・ライブラリのバージョンの違いなどにうんざりしている
  • Dockerで動かしている環境のデバックに苦労した経験がある

概要

VSCodeの Remote Containers ものすごく便利ですね。

https://code.visualstudio.com/docs/remote/containers

こちらを活用することで

  • ローカル環境を汚さずに快適な開発環境を整えることができる
    • 保存時のコード自動フォーマット
    • インテリセンス
    • 自動補完
    • デバック環境
  • チームメンバーがVSCodeを活用している場合、チーム全体で同じ環境を共有できる
    • ライブラリのバージョン違い等で悩む必要がなくなる

自動補完イメージ

と非常に重宝しそうです!!

マイクロソフト公式で各言語の設定ファイルのサンプルが公開されています

https://github.com/microsoft/vscode-remote-try-go

今回サクッと試せる Dev Containerのテンプレートを作ってみましたので、公開いたします。

設定ファィルについて

以下のようなディレクトリ構造になっています。

.
|-- .devcontainer
    |-- devcontainer.json
|-- Dockerfile
|-- README.md
|-- cmd
|   `-- main.go
`-- docker-compose.yml

Dockerfile 及び docker-compose.yml は以下のように記載しています。

FROM golang:1.15.6

RUN apt update \
  && apt install -y vim # 不要な場合は削除してください

ENV GO111MODULE on
WORKDIR /go/src/work

# install go tools(自動補完等に必要なツールをコンテナにインストール)
RUN go get github.com/uudashr/gopkgs/v2/cmd/gopkgs \
  github.com/ramya-rao-a/go-outline \
  github.com/nsf/gocode \
  github.com/acroca/go-symbols \
  github.com/fatih/gomodifytags \
  github.com/josharian/impl \
  github.com/haya14busa/goplay/cmd/goplay \
  github.com/go-delve/delve/cmd/dlv \
  golang.org/x/lint/golint \
  golang.org/x/tools/gopls

version: '3'
services:
  app:
    build: .
    tty: true
    stdin_open: true
    command: /bin/bash
    volumes:
      - .:/go/src/work

次に devcontainer.json は以下のように記載しています。

{
  "name": "Go",
  "dockerComposeFile": ["../docker-compose.yml"],
  "service": "app" ,
  "workspaceFolder": "/go/src/work",
  "settings": {
    "terminal.integrated.shell.linux": "/bin/bash",
    "go.toolsManagement.checkForUpdates": "off",
    "go.gopath": "/go",
    "go.gocodeAutoBuild": true,
    "go.formatTool": "gofmt",
    "go.useLanguageServer": true,
    "editor.formatOnSave": false,
    "[go]": {
      "editor.formatOnSave": true
    }
  },
  "extensions": [
    "golang.go"
  ],
}

ここで注意が必要であるのが、
build の設定項目を記載してしまうと、 DockerComposeFile が無視されてしまい、docker-compose.yml が無視されてしまいます

// この設定がある場合 "DockerComposeFile" の設定値が無視されてしまう
"build": {
	"dockerfile": "Dockerfile",
	"args": {
		// Update the VARIANT arg to pick a version of Go: 1, 1.15, 1.14
		"VARIANT": "1",
		// Options
		"INSTALL_NODE": "false",
		"NODE_VERSION": "lts/*"
	}
},

使い方について

実際の利用の仕方については、こちらのリポジトリのReadMeに記載しています。
また、上記設定ファイルの記載についても変更になっている可能性がありますので、うまく動作しない場合はこちらをご参照いただければと思います。

https://github.com/bun913/go_devcontainer

Discussion