一、介绍
go从 v1.11 之后就推出了新的包管理,go module,它和之前的$GOPATH不同,已经不在需要src,bin这样的子目录了,一个源代码目录甚至是空目录都可以作为module,只要其中包含有go.mod文件。
module 是一个相关Go包的集合,它是源代码更替和版本控制的单元。模块由源文件形成的go.mod文件的根目录定义,包含 go.mod 文件的目录也被称为模块根。moudles取代旧的的基于GOPATH方法来指定在工程中使用哪些源文件或导入包。模块路径是导入包的路径前缀, go.mod 文件定义模块路径,并且列出了在项目构建过程中使用的特定版本。
go1.11.1
g o . mod 文件
-
go.mod
文件 定义module
路径以及列出其他需要 在build
时引入的模块的特定的 版本 ,如下 。module gomodule_demo go 1.14 require ( github.com/sirupsen/logrus v1.6.0 github.com/stretchr/testify v1.4.0 // indirect golang.org/x/sys v0.0.0-20200116001909-b77594299b42 // indirect gopkg.in/yaml.v2 v2.2.8 // indirect )
-
module:用于定义当前项目的模块路径。
-
go:用于标识当前模块的 Go 语言版本,值为初始化模块时的版本,目前来看还只是个标识作用。
-
require:用于设置一个特定的模块版本。
-
exclude:用于从使用中排除一个特定的模块版本。
-
replace:用于将一个模块版本替换为另外一个模块版本。
go.sum文件
- 构建状态跟踪文件。它会记录当前module所有的顶层和间接依赖,以及这些依赖的校验和
- 保留过去使用的包的版本信息,以便日后可能的版本回退
- 必须提交到git代码仓库
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= ........
环境变量——GO111MODULE
Go 1.11中
的 module
支持临时环境变量—— GO111MODULE
,它可以设置以下三个值: off
, on
或者 auto
(默认)。
- 如果
GO111MODULE=off
,那么go
命令行将不会使用新的module
功能,相反的,它将会在vendor
目录下和GOPATH
目录中查找依赖包。也把这种模式叫GOPATH模式
。 - 如果
GO111MODULE=on
,那么go
命令行就会使用modules
功能,而不会访问GOPATH
。也把这种模式称作module-aware
模式,这种模式下,GOPATH
不再在build
时扮演导入的角色,但是尽管如此,它还是承担着存储下载依赖包的角色。它会将依赖包放在GOPATH/pkg/mod
目录下。 - 如果
GO111MODULE=auto
,这种模式是默认的模式,也就是说在你不设置的情况下,就是auto
。这种情况下,go
命令行会根据当前目录来决定是否启用module
功能。只有当当前目录在GOPATH/src
目录之外而且当前目录包含go.mod
文件或者其子目录包含go.mod
文件才会启用。
二、go mod 相关命令
go mod init
生成 go.mod 文件 (Go 1.13 中唯一一个可以生成 go.mod 文件的子命令)
go mod tidy -v
整理现有的依赖,删除未使用的依赖。
go mod vendor
导出现有的所有依赖 (事实上 Go modules 正在淡化 Vendor 的概念)
接下来使用go build -mod=vendor来构建项目, 因为在go modules模式下go build是屏蔽vendor机制的,所以需要特定参数重新开启vendor机制:
go mod graph
查看现有的依赖结构
go mod download
下载 go.mod 文件中指明的所有依赖
go mod edit
编辑 go.mod 文件
go mod verify
校验一个模块是否被篡改过
go clean -modcache
清理所有已缓存的模块版本数据。
go mod
查看所有 go mod的使用命令。
三、版本号
其版本格式为 “主版本号.次版本号.修订号”,版本号的递增规则如下:
-
主版本号:当你做了不兼容的 API 修改。
-
次版本号:当你做了向下兼容的功能性新增。
- 修订号:当你做了向下兼容的问题修正。
四、实操
- 创建一个demo目录
- 初始化go module,生成go.mod和go.sum
- replace替换本地包
- 生成vendor包,使用
go build -mod=vendor
五、 总结
- Go modules 发布于 Go1.11,成长于 Go1.12,丰富于 Go1.13,正式于 Go1.14 推荐在生产上使用,它 出现的目的之一就是为了解决 GOPATH 的问题,也就相当于是抛弃 GOPATH 了。
- 一般情况,
go mod init
和go mod tidy -v
两个命令就够用了。 - 建议 export GOPROXY= https://goproxy.io下载比较快。
有疑问加站长微信联系(非本文作者)