golang团队在版本1.13及以后全面支持module机制,用于结束混乱复杂的项目管理机制。同学们可以简单的将module机制理解成pip、apt-get等包管理工具。

一个项目(仓库)包括多个module(模块),一个模块包括多个package(包),而一个包含多个代码源文件。

简单的说,在一个module中,module机制自动保证导入所有源文件中使用的标准库和第三方包,而不用逐一go get;同时完成版本管理。

假设已安装golang 1.13或更高版本,则默认开启module机制,所以可以直接使用module相关的命令。

初始化module

通过go init初始化module后,在该目录下生成go.mod文件,用于记录项目中需要的第三方依赖的名称和版本;由于项目中可能使用相同依赖的不同版本,所以文件根据名称和版本进行区分。

另外会生成go.sum文件,用于记录第三方依赖的校验信息;当有项目交接、迁移等过程时,新的环境必须和go.sum中的记录相同。所以当有版本控制时,go.mod和go.sum两个文件一定要提交

导入第三方依赖

之前通过go get来获取第三方依赖,而基于module机制,只要在源码中进行导入,通过go run/test/build等命令即可自动获取并存储到GOPATH/pkg下,那GOPATH是什么呢?GOPATH可以认为是工作目录,在安装go的时候会有默认值,可以通过命令查看:

当然可以通过命令更改GOPATH目录

通过类似go build等命令,第三方依赖都会被下载到GOPATH/pkg目录下。

例如,在test目录下编写如下源码并执行:go run main.go

大家可以发现两点: 第一、GOPATH/pkg下有quote的第三方包; 第二、go.mod多了一行:require http://rsc.io/quote v1.5.2 // indirect。require是关键词,其他的关键词还有module、replace和exclude;v1.5.2是版本。

到这里其实大家已经可以进行项目开发了,再简单的介绍几种命令,可能会用到。

go get:前面提到不需要用go get来获取第三方依赖,但是module只能自动获取特定格式的第三方依赖,而对其它非特定格式的第三方依赖依旧需要go get指令。

go mod tidy:检查所有依赖,删除没有使用的依赖。

自从推出module机制,同学们就能愉快的开发项目啦。

如果接手某个使用go vendor机制管理的项目时,记得将GO111MODULE关闭喔