自从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功能了。(当然大部分问题挂个梯子就能解决,但是我们也可以有其它选项)
|
|
修改后悔自动生成
|
|