Go 1.16 中关于go get 和go install 你需要注意的地方 - MoeLove
文章推薦指數: 80 %
概览 · 基本上 go install
我看大多数人都在关注Go在苹果(Apple)M1上的支持,甚至Go官方博客中也有一篇专门的说明GoonARMandBeyond,来介绍Go在此方面的支持。
我就不凑热闹了,我来聊聊Go1.16中关于goget和goinstall你需要注意的地方。
目前Docker官方镜像尚未发布,我是本地构建了个镜像来使用。
(MoeLove)➜goversion
goversiongo1.16beta1linux/amd64
概览Go1.16中包含着大量的Modules相关的更新,详细内容可直接查看其ReleaseNote。
整体而言,包含以下要点:GO111MODULE默认为on,如果要恢复到之前的行为,则需要将GO111MODULE设置为auto,这样差不多意味着GOPATH模式要逐步淡出人们的视野了;goinstall命令可以接受一个版本后缀了,(例如,goinstallsigs.k8s.io/[email protected]),并且它是在模块感知的模式下运行,可忽略当前目录或上层目录的go.mod文件。
这对于在不影响主模块依赖的情况下,安装二进制很方便;在将来,goinstall被设计为“用于构建和安装二进制文件”,goget则被设计为“用于编辑go.mod变更依赖”,并且使用时,应该与-d参数共用,在将来版本中-d可能会默认启用;gobuild和gotest默认情况下不再修改go.mod和go.sum。
可通过gomodtidy,goget或者手动完成;总结而言,关于goinstall和goget必须要注意的是:基本上goinstall
goget由于具备更改go.mod文件的能力,因此我们必须要避免执行goget命令时,让它接触到我们的go.mod文件,否则它会将我们安装的工具作为一个依赖。
目前的解决方案通常是:(MoeLove)➜cd$(mktemp-d);GO111MODULE=ongogetsigs.k8s.io/[email protected]
自1.16开始,我们可以直接使用下面的方式:(MoeLove)➜goinstallsigs.k8s.io/[email protected]
非常的简单直观。
需要注意的是goinstall
此外由于Go1.16中GO111MODULE默认是打开的,goinstall不会修改go.mod之类的文件,不会造成任何意外。
注意:@version只能安装主软件包。
非主程序包不受此格式约束。
关于不带@version的goinstall在模块外,不带@version是无法安装的,会有如下错误:(MoeLove)➜goinstall-vsigs.k8s.io/kind
goinstall:versionisrequiredwhencurrentdirectoryisnotinamodule
Try'goinstallsigs.k8s.io/[email protected]'toinstallthelatestversion
如果你在模块目录中,并且你不带@version执行安装的话,只能安装go.mod中已经包含的版本。
并且不能安装未出现在go.mod中的包。
(MoeLove)➜mkdir-p/go/src/github.com/moelove/iris
(MoeLove)➜cd/go/src/github.com/moelove/iris
#初始化模块
(MoeLove)➜/go/src/github.com/moelove/irisgomodinit
go:creatingnewgo.mod:modulegithub.com/moelove/iris
(MoeLove)➜/go/src/github.com/moelove/iriscatgo.mod
modulegithub.com/moelove/iris
go1.16
#不带@version无法安装
(MoeLove)➜/go/src/github.com/moelove/irisgoinstall-vsigs.k8s.io/kind
norequiredmoduleprovidespackagesigs.k8s.io/kind;try'goget-dsigs.k8s.io/kind'toaddit
#用goget-d下载
(MoeLove)➜/go/src/github.com/moelove/irisgoget-dsigs.k8s.io/kind
goget:addedsigs.k8s.io/kindv0.9.0
#可以看到已经被添加到了模块依赖中
(MoeLove)➜/go/src/github.com/moelove/iriscatgo.mod
modulegithub.com/moelove/iris
go1.16
requiresigs.k8s.io/kindv0.9.0//indirect
#删除本地的kind工具
(MoeLove)➜/go/src/github.com/moelove/iriswhichkind
/go/bin/kind
(MoeLove)➜/go/src/github.com/moelove/irisrm/go/bin/kind
(MoeLove)➜/go/src/github.com/moelove/iriswhichkind
#不带@version进行安装
(MoeLove)➜/go/src/github.com/moelove/irisgoinstall-vsigs.k8s.io/kind
(MoeLove)➜/go/src/github.com/moelove/iriswhichkind
/go/bin/kind
(MoeLove)➜/go/src/github.com/moelove/iriskindversion
kindv0.9.0go1.16beta1linux/amd64
关于goget和go.modgoget将二进制安装相关的功能都转移到了goinstall,仅作为用于编辑go.mod文件的命令存在。
在后续版本(计划是Go1.17)中删掉goget安装二进制的功能,接下来goget的行为就等同于我们现在执行goget-d命令了,仅需下载源码,并将依赖添加至go.mod即可。
go.mod如何编辑在Go1.16中,另一个行为变更是gobuild和gotest不会自动编辑go.mod了,基于以上信息,Go1.16中将进行如下处理:通过在代码中修改import语句,来修改go.mod:goget可用于添加新模块;gomodtidy删除掉无用的模块;将未导入的模块写入go.mod:goget
总结Go1.16中goinstall和goget方面有些不兼容的变更,但是1.16中模块更加简洁,减少了使用时的心智负担,我还是很期待这个版本的。
欢迎订阅我的文章公众号【MoeLove】作者:张晋涛链接:https://moelove.info/2020/12/19/Go-1.16-中关于-go-get-和-go-install-你需要注意的地方/许可:CCBY-NC-SA4.0相关文章:万字长文:彻底搞懂容器镜像构建golang
延伸文章資訊
- 1go get命令——一键获取代码、编译并安装 - C语言中文网
go get可以借助代码管理工具通过远程拉取或更新代码包及其依赖包,并自动完成编译和安装。整个过程就像安装一个App一样简单。 使用go get前,需要安装与远程包匹配的 ...
- 2GoGet – 你的求職夥伴
- 3Go 1.16 中关于go get 和go install 你需要注意的地方 - MoeLove
概览 · 基本上 go install <package>@<version> 是用于命令的全局安装: · go get 安装二进制的功能,后续版本将会删除; · go get 主要被设计为修改...
- 4go get - GO 命令教程- 极客学院Wiki
命令 go get 可以根据要求和实际情况从互联网上下载或更新指定的代码包及其依赖包,并对它们进行编译和安装。在上面这个示例中,我们从著名的代码托管 ...
- 5Go Module與Go get 常用參數說明 - 關於網路那些事...
不支持module,會從GOPATH 或vendor 來尋找。如果不是在GOPATH 執行go mod init 則會報錯。 GO111MODULE=auto, 會檢查當前目錄是否啟用go.mo...