跳到主要内容

Go 语言 go mod 包依赖管理工具

前文了解了 Go 语言中的包来复用代码,一直以来 Go 语言的包管理都是饱受开发者诟病的一个软肋,直到官方推出了 go mod。这个强大的包管理工具使得我们彻底告别了 Go 语言繁琐的包管理。本文就来介绍以下如何使用 go mod 来进行包管理

Tips:只有在Go11.1之后的版本有这个工具,在Go语言13.0以后该工具趋于完善。本文的Go版本为13.5,建议使用最新版本的Go语言环境。

1. 指令介绍

在控制台中输入go mod指令,会出来这个工具的帮助命令。

图片描述

指令解析如下表:

指令功能
go mod download下载依赖包到本地(默认下载目录为 $GOPATH/pkg/mod)
go mod edit编辑 go.mod 文件(不常用)
go mod graph输出go mod的依赖图
go mod init初始化一个mod项目,即在包中示创建一个go.mod文件
go mod tidy自动补全新增(删除减少)的依赖包
go mod verify校验依赖包
go mod why解释为什么要依赖,即显示这个包在哪里被导入了(不常用)

2. 代理配置

go mod 虽然可以直接帮我们下载好我们需要的包,但是因为 Go 语言很多包都是在国外的服务器上,国内下载具有一定的困难。但是不用担心,go mod 提供了代理服务,同时很多国内的云服务器产商都提供了自己的代理服务:

阿里云: https://mirrors.aliyun.com/goproxy

微软: https://goproxy.io

七牛云: https://goproxy.cn

GoCenter: https://gocenter.io

2.1 临时配置方案

go mod 代理的临时配置方案就是在控制台中使用控制台对应的环境变量的修改指令去将 GOPROXY 的值设置为代理值,以 PowerShell 为例:

$env:GOPROXY="https://goproxy.cn"

然后在终端中输入go env GOPROXY来查看修改结果,若输出https://goproxy.cn则为设置成功。这个设置只在当前控制台有效,重启控制台之后就会失效

图片描述

2.2永久配置方案

Go语言自带的环境变量修改指令可以永久修改GOPROXY这个环境变量

Tips:这个指令只能修改go env中的环境变量

go env -w GOPROXY=https://goproxy.cn

然后关闭终端再打开,输入go env GOPROXY结果还是会输出https://goproxy.cn

图片描述

3. go mod 中使用 replace

replace 是用于使用本地包来替换导入包的一个操作,毕竟并不是所有导入包都能够下载的到,也有一些是你自己开发,并未上传到网络中的代码,这时候如果要在 go mod 中导入就需要 replace 了。

使用代码如下:

module firstgo

go 1.13

replace (
//包导入名 => 本地包相对路径/绝对路径
firstgo/packagetest1 => ./packagetest1
firstgo/packagetest2 => ./packagetest2
)

4. 在项目中使用

在了解了如何使用 go mod 之后,接下介绍一个在项目中使用的例子。在任意文件夹中创建Go文件,然后录入以下代码:

package main

import "github.com/gin-gonic/gin"

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

随后打开控制台,输入:

go mod init
go mod tidy

你就会看到 go mod 会下载很多相关依赖包:

图片描述

Tips:你们下载的依赖包可能会比我多的多,因为我只是为了展示随机删了几个依赖包重新下载。

同时文件夹下多了个 go.mod 和 go.sum ,其中 go.sum 不用在意,其中的内容为导入包的路径、版本和它的hash ,是自动生成自动更新的。

go.mod 的内容为:

module firstgo

go 1.13

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

自动记录了你引用的包路径和版本。如果要修改使用版本,直接修改版本号即可

5. 小结

本文主要介绍了Go语言的包管理工具 go mod ,以下是其注意事项:

  • 可以在非 $GOPATH/src 的目录中创建 go mod 项目;
  • 在下载不到包的情况可以选择使用代理;
  • 在使用本地包时可以使用 replace。