GO语言工程实践笔记Golang Module | 青训营

66 阅读4分钟

Go Module实践

Go Module是golang的包管理工具(用于管理包依赖关系):
取代了原有的基于GOPATH方法来指定在工程中使用哪些源文件或导入包。极大地简化了Go项目的包管理和版本控制,并提供了更好的依赖管理和构建重复性的功能。

传统的包管理方式

在go 1.11版本之前,安装Go语言之后往往需要配置两个环境变量,即GOPATH和GOROOT,前者是开发工作目录路径,用于存放go源代码,后者是golang安装的路径。

GOPATH路径内有三个文件夹:

  1. bin:go编译后的可执行文件所在文件夹
  2. pkg:编译非main包的中间连接文件
  3. src:go项目源代码

开发者将研发的项目放到GOPATH目录下,同时,,将引入的第三方包下载到GOPATH/pkg目录下。 在使用时,若需要引入某包,首先在项目中import导入该包:
import "包地址"
然后用go get命令将该包下载下来:
go get 包地址
运行该命令后,Go会访问该地址并下载该包。下载完成后,该包会被保存到 $GOPATH/pkg/包地址目录下。

传统方式的不足之处

  1. 所有项目都必须在GOPATH/src目录下,或者必须更改GOPATH环境变量所指的目录。
    在研发不同项目时需要修改环境变量以保证各项目不混在一起。
  2. 对于依赖的同一个包只能从master分支上导入最新的提交,且不能导入包的指定版本。
    某项目首次引入该包后升级或重新引入该包,go get命令不能指定版本参数,造成不能兼容,同时新得到的包还是同样被放在GOPATH/pkg目录下,由于没有版本管理会覆盖之前的包。

Go Module管理方式

一个module是包含多个package的目录。

  • 一个module必须是一个代码控制系统的仓库,并且一个仓库只能包含一个module。
  • 一个module包含一个或多个package。
  • 一个包应该在同一个目录下包含一个或多个go文件。

创建module

一、在GOPATH之外选定位置创建目录。 再创建一个代码仓库(一般在GitHub上创建git的代码仓库。
二、go init初始化module,在该目录下生成go.mod文件,用于记录项目中需要的第三方依赖的名称和版本。
另外会生成go.sum文件,用于记录第三方依赖的校验信息;当有项目交接、迁移等过程时,新的环境必须和go.sum中的记录相同。所以当有版本控制时,go.mod和go.sum两个文件一定要提交。

go mod init git仓库目录

该目录会创建go.mod文件,包含定义的module的导入路径和依赖的包及其对应的版本。
三、导入第三方依赖,之前通过go get来获取第三方依赖,而基于module机制,只要在源码中进行导入,通过go run/test/build等命令即可自动获取并存储到GOPATH/pkg下。 可通过下面命令查看GOPATH目录:

go env | grep GOPATH

也可通过下面命令更改GOPATH目录:

go env -w GOPATH=/xxx/xxx/xxx

通过类似go build等命令,第三方依赖都会被下载到GOPATH/pkg目录下。 在使用 Go Module 进行包依赖管理时,还有一些其他常用的命令和功能:

  • go list:列出当前模块的所有依赖项。
  • go build / go run:构建或运行包含 Go Module 的项目。
  • go mod edit:编辑 go.mod 文件,手动添加、删除或更新依赖项。
  • go mod graph:显示模块之间的依赖关系图。
  • go mod verify:验证模块的依赖项已经完整下载并且没有被篡改。

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

小结

Go Module在Go1.13版本开始将成为Go语言默认的依赖管理工具。提供了更灵活更可靠的包管理方式,在开发者进行项目管理时能够提供更好的依赖关系,无论是添加新的依赖还是更新现有依赖都使其更加容易。