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 付けなくていいのでは?みたいなのも考慮に入れるといいかと。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.