加载中...

Go mod 依赖管理


Go mod 依赖管理

go mod 是什么

go modules是 golang 1.11引入的新特性。Modules官方定义为:

模块是相关Go包的集合。modules是源代码交换和版本控制的单元。go命令直接支持使用modules,包括记录和解析对其他模块的依赖性。modules替换旧的基于GOPATH的方法来指定在给定构建中使用哪些源文件。

GO111MODULE有三个值:off、on 和 auto(默认值)

  • GO111MODULE=off,无模块支持,go 会从 GOPATH 和 vendor 文件夹寻找包

  • GO111MODULE=on,模块支持,go 会忽略 GOPATH 和 vendor 文件夹,只根据 go.mod 下载依赖

  • GO111MODULE=auto,默认值,go命令行将会根据当前目录来决定是否启用module功能。这种情况下可以分为两种情形:

    1. 当前目录在GOPATH/src之外且该目录包含go.mod文件
    2. 当前文件在包含go.mod文件的目录下面。

在使用模块的时候,GOPATH 是无意义的,不过它还是会把下载的依赖储存在 $GOPATH/pkg/mod 中,也会把 go install 的结果放在 $GOPATH/bin 中。

启用go mod

go env -w GO111MODULE=on

GOPROXY设置代理

由于国内网络原因,Go生态系统中有许多无法直接获取的模块,且GitHub获取模块速度慢,因此需要配置GOPROXY来加速Module依赖下载:

go env -w GOPROXY=https://goproxy.cn,direct

go.mod 文件

go mod初始化会自动生成go.mod文件,初始化命令如下:

# go mod 初始化
go mod init 模块名(一般是文件夹名)  

go.mod 文件详解:

// 模块名
module hello
// go sdk 版本
go 1.23.4

// 当前module(项目)依赖的包
require (
	// dependency latest
)

// 排除第三方包
exclude (
	// dependency latest
)

// 修改依赖包的路径或版本
// 依赖包发生迁移
// 原始包无法访问
// 使用本地包替换原始包
replace (
	source latest => target latest
)

// 撤回
// 当前项目作为其他项目的依赖,如果某个版本出现了问题则撤回该版本
retract (
	v1.0.1
)

go mod 命令

go mod init

初始化一个新的模块到当前目录

go mod init
# 例如
go mod init gomodcase

go mod tidy

依赖对齐:添加缺少的依赖,删除未使用的依赖

go mod tidy

go mod download

将模块下载到本地缓存,需要指定模块路径及版本号

注意:只会下载当前指定的模块,不会同时下载其依赖!

go mod download
# 例如
go mod download github.com/gin-gonic/gin@v1.9.0

go mod edit

通过工具或脚本编辑go.mod

go mod edit
# 例如
# 添加依赖项
go mod edit -require="github.com/gin-gonic/gin@v1.9.0"
# 替换路径,old[@version]替换成 new[@version]
go mod edit -replace="golang.org/x/crypto@v0.0.0=github.com/golang/crypto@latest'
# 排除第三方依赖的某个版本
go mod edit -exclude="github.com/gin-gonic/gin@v1.9.0"
# 当前项目作为其他项目的依赖时,添加撤回版本用于排除有问题的版本
go mod edit -retract="v1.0.0"
go mod edit -retract='v1.1.0"
# 删除撤回版本记录
go mod edit -dropretract="v1.0.0"

go mod vendor

根据go.mod中的依赖项制作vendor副本

有了vendor副本,项目将不再依赖本地缓存

go mod vendor

go mod verify

验证依赖是否正确:

go mod verify

go mod why

返回对指定模块的依赖关系最短路径,解释为什么依赖指定包

go mod why
# 例如
go mod why github.com/go-playground/validator/v10

go install/get/clean

# go insta11 安装可执行插件
# 例如
go insta11 github.com/google/gops@latest

# go get 获取模块信息并更新go.mod文件
# 若本地缓存没有该模块,则下载模块;若有则直接引用
# 例如
go get github.com/gin-gonic/gin@v1.9.0

# go get -u 更新模块依赖,并更新go.mod
go get -u github.com/gin-gonic/gin@v1.9.0

# go clean 清理临时目录中的文件
# 例如: 清理整个module下载的缓存文件
go clean -modcache

文章作者: 无夜
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 无夜 !
评论
  目录