話題の記事

VSCodeとDockerでMacにGolangの開発環境を作成する

Visual Studio CodeのExtension "Remote-Containers"を使ってMacにGolangの開発環境を作ってみた
2019.07.12

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、CX事業本部の夏目です。

Golangは最近人気の言語で手を出そうとは思っていたのですが、環境構築がいまいちよくわからなくてできてませんでした。
(goenvを使ってGolangをインストールするときGOPATHはどうしたらいいとかよくわからなかったのです)

今日はVisualCodeとDockerを使って、Golangの開発環境をMac上に作成しようと思います。

環境構築

事前準備

VSCodeとDockerをインストールします。

拡張機能のインストール

VSCodeのExtension "Remote-Containers"を使用して開発環境を作ろうと思います。

Microsoft謹製のExtensionで、Docker Container内で開発をしつつエディターはMacのネイティブのままにできます。

エディターはMac上ですが、VSCodeのTerminalはDocker Container内で動くようになります。


Developing inside a Container using Visual Studio Code Remote Development

使い方や設定の詳細が気になる方は上記サイトで確認してください。

Remote-Containersの設定をする

開発を行うディレクトリをVSCodeで開いて、設定を行います。

Window左下のこのマークをクリックして、Remote-Containers: Add Development Container Configuration Files...を選択します。

Remote-Containers: Add Development Container Configuration Files...を選択すると、何の開発環境を作るのか聞かれるのでgoと入力し、Go golang:1を選択します。

すると、環境の設定に必要なファイルが生成されます。

この状態で、右下のReopen in Containerボタンを押すか、左下のアイコンをクリックしてRemote-Containers: Reopen Folder in Containerを選択すると、VSCodeがリロードされ、開発用のコンテナの作成等が行われます。

(作成中の様子。右下のdetailsをクリックすると作成の様子を見ることができる)

作成が終了すると、ファイル一覧に先程の設定ファイルが見えるようになる。

1: Dev Containersの右のプラスアイコンをクリックすると、操作できるターミナルが開くので、とりあえずGolangのバージョンを表示させてみる。

これでGoの開発環境が使えるようになりました。

おまけ

.devcontainers.json

開発用のコンテナの設定を記述するファイルです。

.devcontainer/devcontainer.json

// See https://aka.ms/vscode-remote/devcontainer.json for format details.
{
	"name": "Go",
	"dockerFile": "Dockerfile",
	"runArgs": [
		"--cap-add=SYS_PTRACE",
		"--security-opt", "seccomp=unconfined"
	],
	
	// Uncomment the next line if you want to publish any ports.
	// "appPort": [],

	// Uncomment the next line to run commands after the container is created.
	// "postCreateCommand": "go version",

	"extensions": [
		"ms-vscode.go"
	],
	"settings": {
		"go.gopath": "/go"
	}
}

(リファレンス)

例えば、extensionsという項目でコンテナ内のVSCodeに最初からインストールするExtensionを指定することができます。

またデフォルトでは、Dockerfileを使って開発用のコンテナを作成していますが、docker-composeをコンテナの作成をすることもできます。

Golangのパッケージ管理にdepを使う場合

デフォルトの設定では、/workspace/{元々のディレクトリ名}というコンテナ上のディレクトリで開発を行うことになります。

しかし、GOPATHは/goが設定されています。 パッケージ管理ツールdepではプロジェクトのディレクトリが$GOPATH/src/配下でなければいけません。

そのため、デフォルトの設定ではdepは使えません。

devcontainers.jsonに次の値を設定して、作業を行うディレクトリを変更します。

{
  "workspaceFolder": "/go/src/{好きなディレクトリ名}",
  "workspaceMount": "src={VSCodeで開いているディレクトリのフルパス},dst=/go/src/{好きなディレクトリ名},type=bind"
}

workspaceFolderはコンテナ内で開発を行うディレクトリのスペースを指定します。 workspaceMountはdockrコマンドの--mountオプションの内容です。 ここで、srcにVSCodeで開いているディレクトリのフルパスを、dstにコンテナ内のフルパスを指定します。 そのため、dstの値とworkspaceFolderの値は同じ値にします。

こうすることで、開発を行うディレクトリを$GOPATH/src配下にすることができるのでdepを使えるようになります。

まとめ

VSCodeのExtension Remote-Containersを使うことで、Docker Container上にGolangの開発環境を構築することができました。

Remote-ContainersはGolang以外にも使用できるので、VSCodeを使うのであればMac上の環境を汚さずに様々な開発環境を構築できます。

使ってみてください。