Go 1.16 中关于go get 和go install 你需要注意的地方 - MoeLove

文章推薦指數: 80 %
投票人數:10人

概览 · 基本上 go install @ 是用于命令的全局安装: · go get 安装二进制的功能,后续版本将会删除; · go get 主要被设计为修改 go.mod ... Go1.16中关于goget和goinstall你需要注意的地方 2020.12.19  1515  4 分钟目录概览Go1.16中已解决的工具安装问题关于不带@version的goinstall关于goget和go.modgo.mod如何编辑从1.15升级需要注意什么?总结Go(golang)已于18日发布了1.16beta1版本,至此其主体功能已经基本确定。

我看大多数人都在关注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@是用于命令的全局安装:例如:goinstallsigs.k8s.io/[email protected];goget安装二进制的功能,后续版本将会删除;goget主要被设计为修改go.mod追加依赖之类的,但还存在类似gomodtidy之类的命令,所以使用频率可能不会很高;Go1.16中已解决的工具安装问题到目前为止,Go一直使用goget命令,将我们需要的工具安装到$GOPATH/bin目录下,但这种方式存在一个很严重的问题。

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@是从1.16开始增加的,无论你当前是否在一个模块下,此命令都会在$GOPATH/bin下安装指定版本的工具。

此外由于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[@];gomodtidy也可以;手动编辑;从1.15升级需要注意什么?由于gobuild和gotest不会自动编辑go.mod了,所以可以将原本的行为通过gomodtidy共同处理。

总结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加载评论



請為這篇文章評分?