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的新变量,它有三个值offon以及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 getgo buildgo mod等修改和维护go.mod文件。所以你无需担心维护的问题。

总结

Module特性的好处太多了,它让安装哪个依赖包的哪个版本变得极其容易,编译的时候也是一遍过,一下解决了之前Go语言下载依赖包以及编译的痛点。而且它的自动维护,又无需我们担心。更多的go mod的用法还有待学习中,总之这次学习了go mod让我觉得不亏。

avatar

chilihotpot

You Are The JavaScript In My HTML