Go
Makefile
Go3Day 4

Goでサーバー開発するときのMakefileを晒してみる

はじめに

この記事は、Go3 Advent Calendar の4日目の記事です。

Goで開発する際にはテストの実行やlintの実施といった細々としたコマンドを Makefile にまとめることが多いと思います。
これにはコマンド入力の手間を省くのももちろんですが、チーム内でコマンド実行の方法を統一するという意味もあります。「手元でのテストはReadmeに書いてある通りに実行してね」と伝えるよりも、Makefileにまとまってる方が親切です。

ということで、何番煎じか分かりませんが今回は業務で使っている Makefile を晒してみたいと思います。

ちなみに主に以下のツールを利用しています。

  • パッケージ管理: dep
  • 自動リロード: realize
  • DB migration管理: goose

Makefile

以下の物を使用しています。

setup:
    go get -u github.com/golang/dep/cmd/dep
    go get -u golang.org/x/lint/golint
    go get -u golang.org/x/tools/cmd/goimports
    go get -u bitbucket.org/liamstask/goose/cmd/goose
    go get -u github.com/oxequa/realize
    go get -u github.com/motemen/gore
    go get -u github.com/golang/mock/gomock
    go get -u github.com/golang/mock/mockgen
dep:
    dep ensure
lint:
    go tool vet app
    golint -set_exit_status app/...
fmt: lint
    goimports -w app
build: fmt lint
    go build -o dist/server app/server.go
run:
    realize start -n app-server
test:
    env ENV=test go test -cover -race -count=1 ./app/...
goose:
    goose up
    goose -env test up
setup-db: goose
    bin/mysql -T < db/dummy.sql

軽く解説

setup

setupでは開発に必要なcliツールのインストールをまとめてやっています。
depではこういった実行ツール系の依存を解決できないため、このプロジェクトで使うツールの一覧をまとめるという意味もあります。

fmt + lint

lint コマンドではgo vetとgolintによるコード解析をまとめて実施しています。分けて実施する意味もあまりないでしょうし。
fmtではgoimportsによるコードのformattingをしています。最初にlintを実施しているため、普段はmake fmtとやってlintingもformattingもまとめて実施しています。

test

testは何気に環境の指定やオプション指定などで暗黙知が生まれやすいコマンドだと思っています。
-raceなどは当然ciでもチェックしていますが、push前に手元でも見つけられるようにつけています。

ただしこのmake testコマンドはpush前の最終確認などで使うことが多く、開発中はvscodeやIDEの機能を使ってファイル単位でテストを走らせることが多いです。そのためどちらかというと利便性よりも網羅性側に切り倒して作っています。

run

開発中のhot reloadのためにrealizeを導入しています。ただし若干使い方が面倒なため、上のsetupでrealizeを導入しmake runコマンドで勝手に実行することで、新人さんなどがrealizeの存在を意識せず便利な開発環境が使えるようにしています。

終わりに

今回はプロジェクトで使用しているMakefileを晒してみました。
開発中に実行するコマンド類は暗黙知になりやすいため、出来るだけそのようなことが無いようにしていきたいと思います。