はじめに
この記事は、Go3 Advent Calendar の4日目の記事です。
Goで開発する際にはテストの実行やlintの実施といった細々としたコマンドを Makefile にまとめることが多いと思います。
これにはコマンド入力の手間を省くのももちろんですが、チーム内でコマンド実行の方法を統一するという意味もあります。「手元でのテストはReadmeに書いてある通りに実行してね」と伝えるよりも、Makefileにまとまってる方が親切です。
ということで、何番煎じか分かりませんが今回は業務で使っている Makefile を晒してみたいと思います。
ちなみに主に以下のツールを利用しています。
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を晒してみました。
開発中に実行するコマンド類は暗黙知になりやすいため、出来るだけそのようなことが無いようにしていきたいと思います。