不积跬步,无以至千里;不积小流,无以成江海。
码字不易,点赞再看。
Go语言的依赖管理随着版本的迭代正逐渐完善起来。
依赖管理
常见的包管理有,dep、go vendor、glide、go modules 等。过时的东西就不在去研究,这里主要说一下 go modules,go modules是Go1.11版本之后官方推出的版本管理工具,并且从 Go1.13 版本开始,go modules将是Go语言默认的依赖管理工具。
GO111MODULE
要启用go modules 支持首先要设置环境变量 GO111MODULE(通过go env看),通过它可以 开启 或 关闭 模块支持,它有三个可选值:off、on、auto,默认值是auto。
GO111MODULE=off 禁用模块支持,编译时会从GOPATH和vendor文件夹中查找包。
GO111MODULE=on启用模块支持,编译时会忽略GOPATH和vendor文件夹,只根据 go.mod下载依赖。
GO111MODULE=auto,当项目在$GOPATH/src外且项目根目录有go.mod文件时,开启模块支持。
简单来说,设置GO111MODULE=on之后就可以使用go module了,以后就没有必要在GOPATH中创建项目了,并且还能够很好的管理项目依赖的第三方包信息。使用 go modules 管理依赖后会在项目根目录下生成两个文件 go.mod 和go.sum。
GOPROXY
Go1.11之后设置GOPROXY命令为:
export GOPROXY=https://goproxy.cn
Go1.13之后GOPROXY默认值为 https://proxy.golang.org,在国内是无法访问的,所以十分建议大家设置GOPROXY,推荐使用 goproxy.cn。
go env -w GOPROXY=https://goproxy.cn,direct
go mod
常用的go mod 命令
- go mod download 下载依赖的module到本地cache(默认为$GOPATH/pkg/mod目录)
- go mod init 初始化当前文件夹, 创建go.mod文件
- go mod tidy 增加缺少的module,删除无用的module
- go mod vendor 将依赖复制到vendor下
- go mod graph 打印模块依赖图
- go mod edit 编辑go.mod文件
- go mod verify 校验依赖
- go mod why 解释为什么需要依赖
go.mod
go.mod 文件记录了项目所有的依赖信息,其结构大致如下:
module github.com/xxx/studygo/
go 1.13
require (
github.com/DeanThompson/ginpprof v0.0.0-20190408063150-3be636683586
github.com/gin-gonic/gin v1.4.0
github.com/go-sql-driver/mysql v1.4.1
github.com/jmoiron/sqlx v1.2.0
github.com/satori/go.uuid v1.2.0
google.golang.org/appengine v1.6.1 // indirect
)
其中,
- module 用来定义包名
- require 用来定义依赖包及版本
- indirect 表示间接引用
replace
在国内访问golang.org/x的各个包都需要翻墙,你可以在go.mod中使用replace替换成github上对应的库。
replace (
golang.org/x/crypto v0.0.0-20180820150726-614d502a4dac => github.com/golang/crypto v0.0.0-20180820150726-614d502a4dac
golang.org/x/net v0.0.0-20180821023952-922f4815f713 => github.com/golang/net v0.0.0-20180826012351-8a410e7b638d
golang.org/x/text v0.3.0 => github.com/golang/text v0.3.0
)
go mod edit
格式化
因为我们可以手动修改go.mod文件,所以有些时候需要格式化该文件。Go提供了一下命令:
go mod edit -fmt
添加依赖项
go mod edit -require=golang.org/x/text
移除依赖项
如果只是想修改go.mod文件中的内容,那么可以运行go mod edit -droprequire=package path,比如要在go.mod中移除golang.org/x/text包,可以使用如下命令:
go mod edit -droprequire=golang.org/x/text
go Modules 使用
已有项目
如果需要对一个已经存在的项目启用go module,可以按照以下步骤操作:
在项目目录下执行go mod init,生成一个go.mod文件。
执行go get,查找并记录当前项目的依赖,同时生成一个go.sum记录每个依赖库的版本和哈希值。
新项目
对于一个新创建的项目,我们可以在项目文件夹下按照以下步骤操作:
执行go mod init 项目名命令,在当前项目文件夹下创建一个go.mod文件。
手动编辑go.mod中的require依赖项或执行go get自动发现、维护依赖。
实战
在 GOPATH 之外的地方,新建一个空文件夹 go-study。
cd go-stydy && go mod init go-study
输出:
go: creating new go.mod: module go-stydy
这时目录中多一个 go.mod 文件,内容如下:
module go-study
go 1.13
接下来我们新建 main.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": "pong",
})
})
r.Run(":9999") // listen and serve on 0.0.0.0:8080
}
下载依赖包。
go mod tidy
执行完成后,看一下 go.mod 文件:
module go-study
go 1.13
require github.com/gin-gonic/gin v1.6.2
看到新增一个 gin v1.6.2 的包。还生成了一个 go.sum 的文件,记录每个依赖库的版本和哈希值,可以打开看一下。
执行看效果
控制台 输入 go run main.go
浏览器输入:localhost:9999/ping
看到浏览器有json输出 {"message":"pong"}
疑问:
- 目录中没发现 gin 包,包下载到哪了?
在 GOPATH/pkg/mod 目录中。
2.GoLand 编辑器中关于 Gin 的引用变红了?
可以通过编辑器设置
点关注 不迷路
如果你从本篇内容有收获,求 点赞
,求 关注
,求 转发
,让更多的人学习到。
如果本文有任何错误,请批评指教,不胜感激 !
有疑问加站长微信联系(非本文作者)