一种能稍微提高大量 “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 后缀,也许考虑一下这样做会更好。

广告
将在 10 秒后关闭
bannerAds