一种能稍微提高大量 “go get” 速度的技巧
我认为Dep和Vgo等工具似乎成为了时代的潮流,但对于开发工具,仍然有很多人选择通过go get来获取。
在这种情况下,与其反复执行”go get”命令,不如…
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
据说将多个软件包放在一次go get中会更快地下载。
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命令可以自动获取依赖的软件包。如果一次性指定多个软件包,它会自动只下载那些共同被依赖的软件包一次,这样可以稍微提高一点效率。
所以,如果是具有许多共同部分的软件包组合,效果就会非常好!
$ 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的示例服务器和客户端几乎共享相同的依赖关系,因此下载时间减少了大约一半。
还有另一个方案是不加 -u 后缀,也许考虑一下这样做会更好。