Go语言-关于 go get 和 go install
一直以来,我们通常都是通过 go get 来下载并安装包的。但从 Go 1.16 起,不推荐通过 go get 来安装包(主要是说安装可执行文件),也就是说,go get 应该只是用来下载包,而且将来版本可能会给该命令始终加上 -d 标志。
Go 1.16 中包含着大量的 Modules 相关的更新,详细内容可直接查看其 Release Note[2]。整体而言,包含以下要点:
-
GO111MODULE 默认为 on ,如果要恢复到之前的行为,则需要将 GO111MODULE 设置为 auto ,这样差不多意味着 GOPATH 模式要逐步淡出人们的视野了;
-
go install 命令可以接受一个版本后缀了,(例如,go install sigs.k8s.io/kind@v0.9.0),并且它是在模块感知的模式下运行,可忽略当前目录或上层目录的 go.mod 文件。这对于在不影响主模块依赖的情况下,安装二进制很方便;
-
在将来,go install 被设计为“用于构建和安装二进制文件”, go get 则被设计为 “用于编辑 go.mod 变更依赖”,并且使用时,应该与 -d 参数共用,在将来版本中 -d 可能会默认启用;
-
go build 和 go test 默认情况下不再修改 go.mod 和 go.sum。可通过 go mod tidy ,go get 或者手动完成;
总结而言,关于 go install 和 go get 必须要注意的是:
- 基本上 go install @ 是用于命令的全局安装:
例如:go install sigs.k8s.io/kind@v0.9.0; - go get 安装二进制的功能,后续版本将会删除;
- go get 主要被设计为修改 go.mod 追加依赖之类的,但还存在类似 go mod tidy 之类的命令,所以使用频率可能不会很高;
go get 存在的问题
到目前为止,Go 一直使用 go get 命令,将我们需要的工具安装到 $GOPATH/bin 目录下,但这种方式存在一个很严重的问题。go get 由于具备更改 go.mod 文件的能力,因此我们必须要避免执行 go get 命令时,让它接触到我们的 go.mod 文件 ,否则它会将我们安装的工具作为一个依赖更新到go.mod文件中。
目前的解决方案通常是:我们切换到非go mod项目目录的临时目录下,执行go get。
自 1.16 开始,我们可以直接使用go install
,完全不用切换目录。go install 不会更新go.mod文件。
需要注意的是 go install <package>@<version>
是从 1.16 开始增加的,无论你当前是否在一个模块下,此命令都会在 $GOPATH/bin
下安装指定版本的工具。
此外由于 Go 1.16 中 GO111MODULE 默认是打开的,go install 不会修改 go.mod 之类的文件,不会造成任何意外。
当你第一次执行 go install
命令的时候,因为本地无缓存,需要下载所有的依赖模块,所以安装速度会比较慢,请你耐心等待。
参考
Go 1.16 中关于 go get 和 go install 你需要注意的地方
参考URL: https://zhuanlan.zhihu.com/p/338011682
[推荐]Go 1.16 中关于 go get 和 go install 需要注意的地方
参考URL: https://www.bilibili.com/video/av500669206/