dep
やら vgo
やらが時代の潮流のようですが、開発ツールに関しては地道に go get
で落としている人も多いと思います。
こういう時、go getコマンドを何度も実行するよりも…
go_get_1.sh
go get -v -u golang.org/x/tools/cmd/goimports
go get -v -u honnef.co/go/tools/cmd/staticcheck
go get -v -u github.com/kisielk/errcheck
go get -v -u bitbucket.org/liamstask/goose/cmd/goose
go get -v -u github.com/knq/xo
go get -v -u github.com/joho/godotenv/cmd/godotenv
go get -v -u github.com/githubnemo/CompileDaemon
こんな風に1回の go get
に複数パッケージを並べて書いたほうが高速にダウンロードできるようです。
go_get_2.sh
go get -v -u \
golang.org/x/tools/cmd/goimports \
honnef.co/go/tools/cmd/staticcheck \
github.com/kisielk/errcheck \
bitbucket.org/liamstask/goose/cmd/goose \
github.com/knq/xo \
github.com/joho/godotenv/cmd/godotenv \
github.com/githubnemo/CompileDaemon
雑な比較
$ time bash go_get_1.sh
# (中略)
real 0m41.743s
user 0m5.775s
sys 0m5.135s
$ time bash go_get_2.sh
# (中略)
real 0m32.035s
user 0m3.600s
sys 0m3.095s
速くなる理由
go getは依存関係にあるパッケージも自動的に取得してくれます。
複数のパッケージを一気に指定すると、いくつかのパッケージから共通して依存されているパッケージを1回だけ落とすようになるため、その分ちょっと効率的になるようですね。
なので、共通部分が多いパッケージ群だと、効果はばつぐんだ!
$ time bash -c 'go get -u google.golang.org/grpc/examples/helloworld/greeter_server && go get -u google.golang.org/grpc/examples/helloworld/greeter_client'
real 0m29.332s
user 0m2.587s
sys 0m2.430s
$ time bash -c 'go get -u google.golang.org/grpc/examples/helloworld/greeter_server google.golang.org/grpc/examples/helloworld/greeter_client'
real 0m13.669s
user 0m1.252s
sys 0m1.260s
↑gRPCのサンプルのserverとclientですが、依存関係はほぼ共通なので、ダウンロード時間が約半分に減ってますね。
あとはそもそも、 -u
付けなくていいのでは?みたいなのも考慮に入れるといいかと。