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

相关文章
|
4月前
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
370 5
|
5月前
|
Linux Go iOS开发
Go语言100个实战案例-进阶与部署篇:使用Go打包生成可执行文件
本文详解Go语言打包与跨平台编译技巧,涵盖`go build`命令、多平台构建、二进制优化及资源嵌入(embed),助你将项目编译为无依赖的独立可执行文件,轻松实现高效分发与部署。
|
4月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
273 1
|
6月前
|
Cloud Native 安全 Java
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
374 1
|
6月前
|
Cloud Native Go API
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
456 0
|
6月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
308 0
|
6月前
|
Cloud Native Java 中间件
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
322 0
|
6月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
372 0
|
12月前
|
编译器 Go
揭秘 Go 语言中空结构体的强大用法
Go 语言中的空结构体 `struct{}` 不包含任何字段,不占用内存空间。它在实际编程中有多种典型用法:1) 结合 map 实现集合(set)类型;2) 与 channel 搭配用于信号通知;3) 申请超大容量的 Slice 和 Array 以节省内存;4) 作为接口实现时明确表示不关注值。此外,需要注意的是,空结构体作为字段时可能会因内存对齐原因占用额外空间。建议将空结构体放在外层结构体的第一个字段以优化内存使用。
|
12月前
|
运维 监控 算法
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。