注:如果你的 GoLand 不会自动拉取依赖,检查一下 IDE 配置里面是不是没有启用 Go Modules。
go mod 介绍
Modules 官方定义为:
模块是相关 Go 包的集合。modules 是源代码交换和版本控制的单元。go 命令直接支持使用 modules,包括记录和解析对其他模块的依赖性。 modules 替换旧的基于 GOPATH 的方法来指定在给定构建中使用哪些源文件。
如何使用 go mod
1 | go env -w GO111MODULE=on |
我们可以先设置一下 GO111MODULE
和 GOPROXY
环境变量,可以直接加到环境变量中:
GO111MODULE=on
开启 go modules 功能GOPROXY
设置 go 代理,下载依赖的时候可以更快地下载
go mod 命令
go mod download
:下载依赖包go mod edit
:编辑 go.modgo mod graph
:打印模块依赖图go mod init
:初始化新的 go module 在当前目录(嗯,是的,我们写的代码其实也等于是一个 go module)go mod tidy
:拉取缺少的模块,移除不用的模块go mod vendor
:将依赖复制到 vendor 下go mod verify
:验证依赖是否正确go mod why
:解释为什么需要依赖
go.mod 文件
1 | module hello |
go.mod
文件一旦创建后,它的内容将会被 go toolchain
全面掌控。go toolchain 会在各类命令执行时,比如
go get
、go build
、go mod
等修改和维护 go.mod
文件。
go.mod
提供了
module
,require
,replace
和
exclude
四个命令。
module
:指定包的名字(路径)require
:指定依赖项模块replace
:替换依赖模块(比如自己修改了一版,就可以使用replace
将依赖替换为自己的实现,但是代码里面import
路径还是旧的路径)exclude
:用于排除某个包的特定版本,与replace
类似,仅在当前 module 为main module
时有效,其他项目引用当前项目时,exclude
指令会被忽略
go module 安装依赖的原则是先拉取最新的 release tag,若无则拉最新的 commit。
go 会自动生成一个 go.sum 文件来记录 dependency tree。
go get 升级
1 | go get -u need-upgrade-package |
升级后会将新的依赖版本更新到 go.mod
,也可以使用
go get -u
升级所有依赖。
- 运行
go get -u
将会升级到最新的次要版本或者修订版本(x.y.z 是修订版本号,y 是次要版本号) - 运行
go get -u=patch
将会升级到最新的修订版本 - 运行
go get package@version
将会升级到指定的版本号 version - 运行
go get
如果有版本的更改,那么go.mod
文件也会更改
go.sum
这个文件记录了当前拉取的实际的版本号。可以保证我们每次拉取的都是相同的版本,除非我们手动去更新。