Go Modules包管理

Yaurora

Go Modules是Go依赖解决的方案,发布于go1.11, 是官方推荐使用的方案.

为什么使用Go Modules

原来包管理方式

在Go Modules之前,项目采用的是GOPATH模式,GOPATH是布置Go开发环境时设置的一个环境变量。

我们需要将Go的项目代码,存放在GOPATH目录的src文件夹下。

go get 获取三方依赖也会自动下载到GOPATH/src下, 而且没有选择性,默认会下载最新版本的包。会出现多个项目依赖于不同版本的三方包不兼容的情况

第三方包没有版本的概念,若作者做了不兼容升级,则会影响本地的代码

使用Go Mod解决的问题

自动下载相关依赖包

项目可以存放在其他位置,不用统一放在$GOPATH/src下

项目内会生成一个go.mod文件,罗列出相关的依赖。 类似于package.json

三方包会指明相关版本,可以实现不同版本的依赖

对于已经转移的包,可以用replace替换

配置

使用go env 查看相关环境变量,修改GO111MODULEGOPROXY环境变量

1
2
3
4
5
6
7
8
# 打开go mod 模式 默认是 auto
$ go env -w GO111MODULE="on"
# 使用国内下载源
$ go env -w GOPROXY=https://goproxy.io
# 在项目中初始化一个go.mod文件, 一般模块名和项目名一致
$ go mod init [项目名]
# 自动导入和删除无用包到GOPATH目录下
$ go mod tidy #add missing and remove unused modules

go mod命令使用

  • go mod init:初始化go mod, 生成go.mod文件,后可接参数指定 module 名,上面已经演示过。

  • go mod download:手动触发下载依赖包到本地cache(默认为$GOPATH/pkg/mod目录)

  • go mod graph:打印项目的模块依赖结构

  • go mod tidy:添加缺少的包,且删除无用的包

  • go mod verify:校验模块是否被篡改过

  • go mod why:查看为什么需要依赖

  • go mod vendor :导出项目所有依赖到vendor下

解释

  1. vendor是项目缓存,为了防止开源代码项目被删除无法引用下载,会使用vendor来做缓存管理,它是独立的,你可以手动管理引用的包,代码包查找的顺序是向上冒泡
1
2
3
4
5
6
包同目录下的vendor
包目录向上的最近的一个vendor
...
GOPATH src 下的vendor
GOROOT src
GOPATH src
  1. go mod 只是一个依赖包版本管理工具,包的查找顺序还是一样的,使用mod就不用把代码都放到src下来管理,可以根据go.mod文件中记录的版本来索引

  2. 关于三方包删除的问题,官方没有相关删除的命令。若要删除,需要手动删除相关包。这样做,可能是因为项目中所有需要的三方包都保存在$GOPATH下,不同的项目之前可能有依赖,所以不能随便删除。

  • 标题: Go Modules包管理
  • 作者: Yaurora
  • 创建于 : 2023-03-14 10:31:36
  • 更新于 : 2023-03-19 21:17:38
  • 链接: https://jingyu.life/2023/03/14/go/go-module/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。