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。