依赖管理

依赖管理

Posted by 锐玩道 on May 21, 2021

如果❤️我的文章有帮助,欢迎点赞、关注。这是对我继续技术创作最大的鼓励。更多往期文章在我的个人博客

为什么需要依赖管理

最初的时候,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 目录 下建项目。

题外话:第三方库存放位置

不过如果你学过 PythonPHP 的话,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       以文本模式打印模块需求图