Go Modules:Go语言依赖管理的新篇章

2024-06-06 14:52:18 浏览数 (1)

今天我们来聊聊Go语言的依赖管理神器——Go Modules。

自从Go 1.11版本引入以来,Go Modules 已经成为了Go语言依赖管理的标准。接下来,我将用简单易懂的语言,带你一步步了解Go Modules的安装、使用和最佳实践。

Go Modules 简介

Go Modules 是Go语言官方推荐的依赖管理工具,它解决了以往使用GOPATH时遇到的许多问题,如依赖冲突、版本控制等。

GOPATH 目录

在Go Modules问世之前,Go语言使用GOPATH环境变量来管理项目的工作空间,它包含三个子目录:

  • bin:存储编译生成的二进制文件。
  • pkg:存储预编译的目标文件,加快后续编译速度。
  • src:存储所有 .go 文件或源代码。在编写 Go 应用程序,程序包和库时,一般会以 $GOPATH/src/github.com/foo/bar 的路径进行存放。

go mod 命令

Go Modules 通过go mod命令行工具来管理依赖,你可以使用以下命令来查看所有可用的go mod子命令:

代码语言:bash复制
go help mod

常用 go mod 命令

命令

作用

go mod help

查看帮助信息

go mod init

初始化当前文件夹,生成 go.mod 文件

go mod download

下载 go.mod 文件中指明的所有依赖到本地(默认为 $GOPATH/pkg/mod 目录)增加 -x 参数 go mod download -x 会打印下载信息;go mod download -json 用来查看模块下载的 zip 存放位置,以及解压后的位置;

go mod tidy

整理现有的依赖,执行时会把未使用的 module 移除掉,同时也会增加缺少的包

go mod graph

查看现有的依赖结构图

go mod edit

编辑 go.mod 文件,比如修改项目中使用的 go 版本 go mod edit -go=1.17

go mod vendor

导出项目所有的依赖到 vendor 目录(需要执行 go build -mod=vendor 才可以使用 vendor 作为依赖来编译,但是在 v1.14 及以后的版本中,如果 golang 项目根目录下存在 vendor 目录,go build 命令会默认优先基于 vendor 目录缓存的三方依赖包构建 golang 程序,除非我们在 go build 命令后面加上 -mod=mod 参数)

go mod verify

校验一个模块是否被篡改过,校验从 GOPROXY 服务器上下载的 zip 文件与 GOSUMDB 服务器下载下来的哈希值,是否匹配。

go mod why

查看为什么需要依赖某模块,比如 go mod why gopkg.in/yaml.v2 gopkg.in/yaml.v3

go clean -modcache

可以清空本地下载的 Go Modules 缓存 (会清空 $GOPATH/pkg/mod 目录)

go mod 环境变量

Go Modules 与一些环境变量紧密相关,这些环境变量可以调整Go Modules的行为。

GO111MODULE

GO111MODULE控制模块支持的开启状态。

  • auto:项目包含go.mod文件时启用Go modules(默认值)。
  • on:总是启用Go modules。
  • off:禁用Go modules。

设置方法:

代码语言:shell复制
go env -w GO111MODULE=on

GOPROXY

GOPROXY用于设置Go模块代理,加速模块下载。

默认值:https://proxy.golang.org,direct

设置国内镜像站点:

代码语言:shell复制
# 1. 七牛 CDN
go env -w  GOPROXY=https://goproxy.cn,direct

# 2. 阿里云
go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/,direct

# 3. 官方
go env -w  GOPROXY=https://goproxy.io,direct

GOSUMDB

GOSUMDB用于确保下载的模块版本未被篡改。

默认值:sum.golang.org

国内用户可以通过设置GOPROXY来间接访问GOSUMDB

GONOPROXY/GONOSUMDB/GOPRIVATE

这些环境变量用于处理私有模块。

  • GONOPROXY:设置不走Go Proxy的URL规则。
  • GONOSUMDB:设置不检查哈希的URL规则。
  • GOPRIVATE:设置私有模块的URL规则。

通常,设置GOPRIVATE即可:

代码语言:shell复制
go env -w GOPRIVATE=git.example.com

使用 Go Modules 初始化项目

代码语言:shell复制
# 开启 Go Modules 模块
go env -w GO111MODULE=on

# 创建项目目录
mkdir -p $HOME/modules_test

cd $HOME/modules_test

# 初始化 go.mod 文件
go mod init github.com/pudongping/moudles_test

# 下载依赖库
go get -v github.com/pudongping/test_moudles

总结

通过今天的学习,我们了解了Go Modules的基本使用方法,包括环境变量的配置、项目的初始化、依赖的下载和更新等。Go Modules作为Go语言官方推荐的依赖管理工具,极大地简化了项目管理的复杂性。

go

0 人点赞