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

简介: Go Modules是Go 1.11引入的依赖管理标准,解决`GOPATH`的依赖冲突问题。

今天我们来聊聊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子命令:

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。

设置方法:

go env -w GO111MODULE=on

GOPROXY

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

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

设置国内镜像站点:

# 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即可:

go env -w GOPRIVATE=git.example.com

使用 Go Modules 初始化项目

# 开启 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语言官方推荐的依赖管理工具,极大地简化了项目管理的复杂性。

相关文章
|
1天前
|
Go 定位技术 索引
Go 语言Map(集合) | 19
Go 语言Map(集合) | 19
|
1天前
|
Go
go语言注释,标识符 | 17
go语言注释,标识符 | 17
|
2天前
|
存储 缓存 Go
go语言编程系列(五)
go语言编程系列(五)
|
2天前
|
搜索推荐 Java 编译器
go语言编程系列(四)
go语言编程系列(四)
|
1天前
|
存储 缓存 安全
速成班!去繁存简,一文让你学会go语言基础!!
速成班!去繁存简,一文让你学会go语言基础!!
|
2天前
|
存储 JSON 安全
go语言编程系列(七)
go语言编程系列(七)
|
2天前
|
存储 安全 编译器
go语言编程系列(六)
go语言编程系列(六)
|
Go 前端开发 开发者
Golang 依赖注入(Dependency Injection)
在各种大工程中少不了各种测试,其中 TDD 就是非常流行的一种,在前端开发中用的比较多的 [Jest](https://github.com/facebook/jest) 就是一种,在 Golang 开发命令行工具的时候也是需要 DI 这种模式来实现命令行测试的。
1827 0
|
8天前
|
Shell Go API
Go语言grequests库并发请求的实战案例
Go语言grequests库并发请求的实战案例
|
5天前
|
安全 Go 调度
探索Go语言的并发模型:Goroutines与Channels的魔术
在这个快节奏的技术世界中,Go语言以其简洁的语法和强大的并发处理能力脱颖而出。本文将带你深入了解Go语言的并发模型,如何通过Goroutines和Channels来优雅地处理并发任务,以及它们如何帮助我们构建高效、可扩展的应用程序。

相关实验场景

更多