Go1.11新特性Module
我是一个比较懒的人,一旦习惯了某种事物,就不太愿意去尝试新的事情。就比如这次接触Gost这款Go语言编写的隧道软件的时候,使用到了Go1.11,而其中正好用到了1.11的新特性,Module。
我之前基本一直停留在Go1.10上,感觉1.10也挺稳定的,没必要往上升。虽然习惯了下载依赖包的时候,经常会遇到编译错误,然后逐个找原因,最后大部分原因都是因为下载的依赖包分支的问题。我对于这种手动式的排查已经习以为常了,直到我遇到了Go1.11的新特性Module,我才知道原来下载以及编译可以这么方便。
Gost有两个文件,gost.mod以及gost.sum文件,其中gost.mod就是依赖包的合集,官方的解释是
模块是相关Go包的集合。modules是源代码交换和版本控制的单元。 go命令直接支持使用modules,包括记录和解析对其他模块的依赖性。modules替换旧的基于GOPATH的方法来指定在给定构建中使用哪些源文件。
而gost.sum文件则是对gost.mod文件的依赖树。
什么是GO111MODULE
GO111MODULE
是Go1.11的新变量,它有三个值off
、on
以及auto
。
GO111MODULE=off
,go命令行将不会支持module功能,寻找依赖包的方式将会沿用旧版本那种通过vendor目录或者GOPATH模式来查找。
GO111MODULE=on
,go命令行会使用modules,不会去GOPATH
目录下查找。
GO111MODULE=auto
,即默认值,go命令行将会根据当前目录来决定是否启用module功能。
这种情况下可以分为两种情形:
(1)当前目录在GOPATH/src
之外且该目录包含go.mod文件
(2)当前文件在包含go.mod
文件的目录下面
注意,当Module功能启用时,依赖包的存放位置变更为$GOPATH/pkg/mod
,允许同一个package多个版本并存,且多个项目可以共享缓存的 module。
go mod命令
golang 提供了go mod
命令来管理包。具体可以使用go mod help
来查看。
如何创建mod文件
在你的项目下执行go mod init
命令,即可初始化生成go.mod
以及go.sum
文件。
注意,go.mod
文件一旦创建后,它的内容将会被go toolchain
全面掌控。go toolchain
会在各类命令执行时,比如go get
、go build
、go mod
等修改和维护go.mod
文件。所以你无需担心维护的问题。
总结
Module特性的好处太多了,它让安装哪个依赖包的哪个版本变得极其容易,编译的时候也是一遍过,一下解决了之前Go语言下载依赖包以及编译的痛点。而且它的自动维护,又无需我们担心。更多的go mod
的用法还有待学习中,总之这次学习了go mod
让我觉得不亏。