Makefileで依存パッケージの更新をしてほしいときだけdep ensureさせる

  • 10
    いいね
  • 0
    コメント

私は普段、GoのソースをビルドするMakefileにdep ensureで依存解決するターゲットを書いてます。

チーム開発時は、このターゲットをビルド前に必ず呼び出すようにしていて、依存パッケージがメンバー全員の開発環境で常に最新になるようにしています。

ただ毎回、ビルド時にこれをやってしまうと、環境次第でビルドが遅くなってしまうので、せっかくGoのコンパイルは速いのに残念な感じでした。

そこで、一度dep ensureしたら、Gopkg.lockのチェックサムを保存し、次回の依存解決はチェックサムが変わるまでやらないようにしています。

Makefile
VENDOR_MD5 := $(shell if [[ -f vendor/lock.md5 ]]; then cat vendor/lock.md5; fi)
GOPKG_MD5 := 
ifneq ($(shell type md5 2> /dev/null),)
GOPKG_MD5 :=  $(shell md5 -q Gopkg.lock)
endif
ifneq ($(shell type md5sum 2> /dev/null),)
GOPKG_MD5 :=  $(shell md5sum Gopkg.lock | sed -E 's/ .*//g')
endif


.PHONY: build vendor


build: vendor
    go build -i -o piyo ./*.go


vendor: dep-install
ifneq ($(VENDOR_MD5),$(GOPKG_MD5))
    dep ensure
ifneq ($(shell type md5 2> /dev/null),)
    md5 -q Gopkg.lock >| vendor/lock.md5
else ifneq ($(shell type md5sum 2> /dev/null),)
    md5sum Gopkg.lock | sed -E 's/ .*//g' >| vendor/lock.md5
else
    @echo vendor/lock.md5 was not created 1>&2
endif
else
    @echo vendor/ is already up-to-date
endif


dep-install:
ifeq ($(shell type dep 2> /dev/null),)
    go get -u github.com/golang/dep/...
endif


dep-ensure: dep-install
    dep ensure

めでたし

md5のチェックをせずにdep ensureをする場合はmake dep-ensureします。(その場合は普通にdep ensureすればいいのだけど)