Go Modules包管理工具使用详解

从Go 1.11开始, 引入了官方包(package)依赖管理工具 go mod。之前Golang 主要依靠vendor和GOPATH来管理依赖库,vendor相对主流,但现在官方更推荐使用go mod。Go 1.12 会删除对 GOPATH 的支持,go get 命令也会变成只能获取模块,不能像现在这样直接获取一个裸包。

使用环境变量 GO111MODULE 开启或关闭模块支持,它有三个可选值:off、on、auto,默认值是 auto。

  • GO111MODULE=off 无模块支持,go 会从 GOPATH 和 vendor 文件夹寻找包。
  • GO111MODULE=on 模块支持,go 会忽略 GOPATH 和 vendor 文件夹,只根据 go.mod 下载依赖。
  • GO111MODULE=auto 在 $GOPATH/src 外面且根目录有 go.mod 文件时,开启模块支持。

GO111MODULE=on的时候,go get下载的依赖会储存在 $GOPATH/pkg/mod 中,所以会导致IDE包引入错误。
由于IDE现在默认还没有,需要自行修改,一下以Goland为例。
开启Go Modules

go mod使用

当开启go modules后,你的项目文件夹可以放在任意位置,无需放在 $GOPATH/src中。
例如:新建文件夹F:\Go\www\demo

cd F:\Go\www\demo
go mod init  demo

生成go.mod文件,打开文件内容

module demo

go 1.14

go.mod 是启用了 Go moduels 的项目所必须的最重要的文件,它描述了当前项目(也就是当前模块)的元信息,每一行都以一个动词开头,目前有以下 5 个动词:

  • module:用于定义当前项目的模块路径。
  • go:用于设置预期的 Go 版本。
  • require:用于设置一个特定的模块版本。
  • exclude:用于从使用中排除一个特定的模块版本。
  • replace:用于将一个模块版本替换为另外一个模块版本。

这里的填写格式基本为包引用路径+版本号,另外比较特殊的是 go $version,目前从 Go1.13 的代码里来看,还只是个标识作用,暂时未知未来是否有更大的作用。

新建main.go文件

package main

import (
"github.com/gin-gonic/gin"
"fmt"
)

func main() {
	r := gin.Default()
	r.GET("/ping", func(c *gin.Context) {
		fmt.Println("hello world!")
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})
	r.Run() // listen and serve on 0.0.0.0:8080
}

执行go build

go build

go会自动下载相关的依赖
go build更新依赖
查看go.mod,内容已更新

module demo

go 1.14

require github.com/gin-gonic/gin v1.6.3

默认使用最新版本的package。

更换依赖版本

查看gin所有历史版本

go list -m -versions github.com/gin-gonic/gin

github.com/gin-gonic/gin v1.1.1 v1.1.2 v1.1.3 v1.1.4 v1.3.0 v1.4.0

如果想更换依赖版本,比如v1.3.0,怎么办?

只需执行如下命令

go mod edit -require="github.com/gin-gonic/[email protected]"
go mod  tidy #更新现有依赖

@后跟版本号,这个时候go.mod已经修改好了

require github.com/gin-gonic/gin v1.3.0

查看所有项目依赖的包

go list -m all

旧项目快速迁移项目至 Go Modules

在你项目的根目录下执行 go mod init 项目名 (项目名可不加),以生成 go.mod 文件。
执行 go mod tidy` 更新整理现有的依赖,删除未使用的依赖。

go mod 相关命令

go mod download 下载 go.mod 文件中指明的所有依赖
go mod tidy 整理现有的依赖,删除未使用的依赖。
go mod graph 查看现有的依赖结构
go mod init 生成 go.mod 文件 (Go 1.13 中唯一一个可以生成 go.mod 文件的子命令)
go mod edit 编辑 go.mod 文件
go mod vendor 导出现有的所有依赖 (事实上 Go modules 正在淡化 Vendor 的概念)
go mod verify 校验一个模块是否被篡改过
go clean -modcache 清理所有已缓存的模块版本数据。
go mod 查看所有 go mod的使用命令。

猜你喜欢

转载自blog.csdn.net/uisoul/article/details/108420589