自从Go官方推出 1.11 之后,增加新的依赖管理模块并且更加易于管理项目中所需要的模块。模块是存储在文件树中的 Go 包的集合,其根目录中包含 go.mod 文件。 go.mod 文件定义了模块的模块路径,它也是用于根目录的导入路径,以及它的依赖性要求。每个依赖性要求都被写为模块路径和特定语义版本。
从 Go 1.11 开始,Go 允许在 $GOPATH/src 外的任何目录下使用 go.mod 创建项目。在 $GOPATH/src 中,为了兼容性,Go 命令仍然在旧的 GOPATH 模式下运行。从 ==Go 1.13== 开始,模块模式将成为默认模式。
使用模块开发 Go 代码时出现的一系列常见操作:
- 创建一个新模块。
- 添加依赖项。
- 升级依赖项。
- 删除未使用的依赖项。
要使用go module,首先要设置 ==GO111MODULE=on== ,如果没设置,执行命令的时候会有提示。
==GO111MODULE== 的取值为 off, on, or auto (默认值,因此前面例子里需要注意2个重点)。
off:GOPATH mode,查找vendor和GOPATH目录on:module-aware mode,使用 go module,忽略GOPATH目录auto:如果当前目录不在$GOPATH并且 当前目录(或者父目录)下有go.mod文件,则使用GO111MODULE, 否则仍旧使用GOPATH mode。
| |
go mod 参数说明
| commond | 说明 |
|---|---|
| download | download modules to local cache (下载依赖的module到本地cache)) |
| edit | edit go.mod from tools or scripts (编辑go.mod文件) |
| graph | print module requirement graph (打印模块依赖图)) |
| init | initialize new module in current directory (再当前文件夹下初始化一个新的module, 创建go.mod文件)) |
| tidy | add missing and remove unused modules (增加丢失的module,去掉未用的module) |
| vendor | make vendored copy of dependencies (将依赖复制到vendor下) |
| verify | verify dependencies have expected content (校验依赖) |
| why | explain why packages or modules are needed (解释为什么需要依赖) |
新的项目
可以在GOPATH之外创建新的项目。
使用空目录创建go.mod (module)
| |
go get 升级
- 运行
go get -u将会升级到最新的次要版本或者修订版本(x.y.z, z是修订版本号, y是次要版本号) - 运行
go get -u=patch将会升级到最新的修订版本 - 运行
go get package@version将会升级到指定的版本号version - 运行
go get如果有版本的更改,那么go.mod文件也会更改
包管理
当我们使用go build,go test以及go list时,go会自动得更新go.mod文件,将依赖关系写入其中。
下载的包保存在$GOPATH/
升级依赖项
查看使用到的依赖列表 go list -m all
| |
列出包的历史版本
go list -m -versions {package name}
| |
手动处理依赖关系
go mod tidy 会自动清理掉不需要的依赖项,同时可以将依赖项更新到当前版本。
切换包的版本
| |
清楚缓存
| |
go mod replace
不过因为某些未知原因,并不是所有的包都能直接用go get获取到,这时我们就需要使用go modules的replace功能了。(当然大部分问题挂个梯子就能解决,但是我们也可以有其它选项)
| |
修改后悔自动生成
| |