Go言語のビルド環境 with dep
Go言語は$GOPATHの下で作業しないといけなかったり,depなどの依存関係管理ツールの準備をするのが面倒だったりする.
そこで,Go言語アプリをビルドするためのポータブルな環境を用意してみた.
ここではローカルで開発を行う場合とDocker上で開発を行う場合のどちらにも対応可能になっている.
次のようなディレクトリ構成:
code: bash
$ tree
.
├── Dockerfile
├── Makefile
├── README.md
└── src
└── app
├── Gopkg.lock
├── Gopkg.toml
└── main.go
2 directories, 6 files
次のようなMakefileを利用することで手軽にビルドを行う:
code: Makefile
DIR = $(shell pwd)
APP_DIR = src/app
BINARY_NAME = main
DEP_VERSION = v0.5.0
DEP_CMD = ${DIR}/bin/dep
DOCKER_IMAGE_NAME = golang-dev
all: build
.PHONY: clean
clean:
rm -rf $(BINARY_NAME)
init:
mkdir -p ${DIR}/bin
deps:
cd ${DIR}/${APP_DIR}; GOPATH=${DIR} ${DEP_CMD} ensure
.PHONY: build
build:
GOPATH=${DIR} go build -v -o ${BINARY_NAME} ${DIR}/${APP_DIR}
docker-build:
docker build -t ${DOCKER_IMAGE_NAME} --build-arg DEP_VERSION=${DEP_VERSION} ${DIR}
docker run --rm -v "${DIR}":/go ${DOCKER_IMAGE_NAME} \
sh -c "cd ${APP_DIR}; dep init; dep ensure; cd /go; go build --ldflags '-s -w -linkmode external -extldflags -static'
Docker上でビルドする場合
Docker環境でビルドする場合は以下を実行するだけでdepによる依存管理とビルドが完了する.
$ make docker-build
カレントディレクトリにバイナリ./mainが生成されている.
ビルドしたバイナリを消す場合は以下を実行する:
$ make clean
この方法ではローカルにGolangがインストールされている必要がなく,依存パッケージもプロジェクトごとに管理されるので良い気がする.
ローカルでビルドする場合
ローカル環境にGo言語の環境がある場合は通常通りmakeでビルドを実行できる.
まずdepのインストールやプロジェクトの初期化を行う:
$ make init
すでにsrc/app以下にGopkg.tomlがある場合はdepのインストールと依存パッケージのダウンロードが行われる.
Gopkg.tomlが存在しない場合はあたらに設置され,プロジェクトが初期化される.
新しいパッケージを追加するなどした場合は以下で依存パッケージをダウンロードする:
$ make deps