如果❤️我的文章有帮助,欢迎点赞、关注。这是对我继续技术创作最大的鼓励。更多往期文章在我的个人博客
为什么需要依赖管理
最初的时候,Golang 项目所依赖的第三方包库都存放
在GOPATH目录下。这就导致了一个 Golang 环境下,同一个第三方库,只能保存一个版本代码的问题
如果不同项目依赖同一个第三方库的不同版本就会发生问题。因此 go module
自 Golang 1.11 后应运而生,在 Golang 1.13版本成为语言默认依赖管理工具
GO111MODULE
通过设置 GO111MODULE 可以控制开启
、关闭
go module 工具。
- GO111MODULE=off —— 禁用 go module,程序编译时自动从 GOPATH、vendor 文件夹中查找包;
- GO111MODULE=on —— 启动 go module,程序编译时忽略 GOPATH 和 vendor 文件夹,只根据 go.mod下载依赖;
- GO111MODULE=auto —— 当项目不存在于 GOPATH/src 目录下,且项目根目录存在 go.mod 文件时,开启 go module。
Windows 下开启 GO111MODULE 的命令为:
set GO111MODULE=on
MacOS 或者 Linux 下开启 GO111MODULE 的命令为:
export GO111MODULE=on
开启 go module 工具过后,你就可以不在局限于在 GOPATH/src 目录
下建项目。
题外话:第三方库存放位置
不过如果你学过 Python
、PHP
的话,Golang 的第三方库存放位置 并不在本项目路径
、你指定的vendor 虚拟环境目录
下,而统一存放在 GOPATH/pkg/mod
下。
为什么都统一存放在 GOPATH/pkg/mod
?
既然
不同项目
会依赖不同版本
的同一个第三方库
,那么可定也会有不同项目会依赖相同版本
的同一个第三方库。
既然如此,我统一存放管理第三方库,就能避免不同项目路径下存放相同版本第三方库
而浪费硬盘空间
至于这么原因,我猜和 gofmt
统一代码风格原因一样 —— 既然编程语言不同的代码风格
(形式问题)需要统一(因为团队合作)都能吵一架比一比,那发明者都帮你决定好
,你们别咸吃萝卜淡操心安心搬砖
吧。
三位发明者大概是个温柔的独裁者。这也是 Golang的语言哲学 —— 它都帮你决定好了,你没选择。
GOPROXY
Golang 1.13+ 版本GOPROXY默认值
为 https://proxy.golang.org ,在国内无法访问,所以十分建议设置GOPROXY
go env -w GOPROXY=https://goproxy.cn,https://goproxy.io,direct
常用 go mod 命令
go mod init 初始化当前文件夹, 创建go.mod文件
go mod download 下载依赖第三方库到本地cache(默认GOPATH/pkg/mod)
go clean -modcache 清理第三方库缓存(默认GOPATH/pkg/mod)
go get github.com/gogf/gf@master 下载 gf 库主分支代码
go list -m -versions github.com/gogf/gf 查看可下载版本
go get ./... 下载项目依赖
go get -u 更新第三方库
go mod verify 验证依赖是否正确
go mod tidy 增加缺少的module,删除无用的module
go mod vendor 将依赖复制到vendor下
go mod graph 以文本模式打印模块需求图