Go 开发常用操作技巧--模块管理

简介: Go 依赖管理经历了 3 个阶段,GOPATH、Go Vendor、Go Module。

Go 依赖管理经历了 3 个阶段,GOPATH、Go Vendor、Go Module。

  1. GOPATH

GOPATH 是 Go 语言的一个环境变量,它是 Go 项目的工作区。目录有 3 个结构:

  • bin:项目编译的二进制文件
  • pkg:项目编译生成的lib包
  • src:项目源码

go get 会下载最新版本的包到 src 目录下。因为 src 下只能允许一个版本的存在,所以对于多个项目依赖同一个库的不同版本这种情况,GOPATH 管理模式就显得力不从心了。至此,Go Vendor 出现了。

  1. Go Vendor

1.5 版本推出了vendor机制。就是每个项目的根目录下有一个 vendor 目录,里面存放了该项目的依赖包。go build 的时候会先去 vendor 目录中查找依赖,如果没有找到再去 GOPATH 目录下查找。这样每个项目引入一份依赖的副本,解决了多个项目需要使用同一个 package 依赖的冲突问题。

vendor 机制的缺点是,同一个依赖包如果不同工程想重用,都必须各自复制一份在自己的vendor目录下。不能重用,使得冗余度上升。

  1. Go Module

从 Go1.11 版本开始,官方推出Go module作为包管理工具,在 Go 1.16 默认开启,可以看到在项目目录下有一个 go.mod 文件,且工程项目可以放在GOPATH路径之外。

image.png

go mod 使用

设置的命令如下:

go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct
复制代码

可在命令行中输入:go env 查看 GO111MODULE=on 。

go mod 常用命令:

  • go mod download: 下载模块到本地缓存,缓存路径是 $GOPATH/pkg/mod/cache
  • go mod edit: 是提供了命令版编辑 go.mod 的功能,例如 go mod edit -fmt go.mod 会格式化 go.mod
  • go mod graph: 把模块之间的依赖图显示出来
  • go mod init: 在当前文件夹下初始化一个新的 module,创建 go.mod 文件
  • go mod tidy: 增加缺失的包,移除没用的包
  • go mod vendor: 把依赖拷贝到 vendor 目录下
  • go mod verify: 校验依赖
  • go mod why: 解释为什么需要包和模块
  1. 创建 module

工程项目可以放在 GOPATH 路径之外,执行go mod init modulename 命令可以创建一个 go.mod 文件。在项目根目录建一个 go.mod 文件即可。

go.mod文件结构

  • module :指定模块的名称 (路径)
  • go :依赖的原生 Go SDK 版本
  • require :项目所依赖的模块
  • replace :可以替换依赖的模块
  • exclude :可以忽略依赖的模块
  1. 添加依赖

在 Go1.16 版本之前,运行 go 命令(go run、go build、go test)时,会自动下载并修改 go.mod 文件。

在 Go1.16 版本中,运行go命令,如果 import 的依赖再 go.mod 文件中没有,就不会再自动下载,而会提示错误,需要手动执行 go get 命令下载对应的包。因为自动下载的方式,如果在导入的包没有提供任何依赖的情况下自动添加新的依赖,有可能会引起公共依赖包的升级等。

  1. go get更新依赖
  • go get -u :更新到最新的次要版本或者修订版本(x.y.z)
  • go get -u=patch :更新到最新的修订版本
  • go get package@version :更新到指定的版本号version
  • 运行 go get 如果有版本的更改,那么 go.mod 文件也会作出相应的更改。
  1. go.sum 文件

go.sum 是记录了所有依赖的 module 的校验信息,以防下载的依赖被恶意篡改,主要用于安全校验。格式如下:

<module> <version> <hash>
<module> <version>/go.mod <hash>
复制代码

module 是依赖的路径。version 是依赖的版本号。如果 version 后面跟 /go.mod 表示对哈希值是 module 的 go.mod 文件;否则,哈希值是 module 的.zip文件。

go.mod 和 go.sum 文件都需要被加入版本管理中。

相关文章
|
4月前
|
缓存 弹性计算 API
用 Go 快速开发一个 RESTful API 服务
用 Go 快速开发一个 RESTful API 服务
|
25天前
|
开发框架 Go 计算机视觉
纯Go语言开发人脸检测、瞳孔/眼睛定位与面部特征检测插件-助力GoFly快速开发框架
开发纯go插件的原因是因为目前 Go 生态系统中几乎所有现有的人脸检测解决方案都是纯粹绑定到一些 C/C++ 库,如 OpenCV 或 dlib,但通过 cgo 调用 C 程序会引入巨大的延迟,并在性能方面产生显著的权衡。此外,在许多情况下,在各种平台上安装 OpenCV 是很麻烦的。使用纯Go开发的插件不仅在开发时方便,在项目部署和项目维护也能省很多时间精力。
|
1月前
|
Go 数据安全/隐私保护 开发者
Go语言开发
【10月更文挑战第26天】Go语言开发
42 3
|
1月前
|
Java 程序员 Go
Go语言的开发
【10月更文挑战第25天】Go语言的开发
34 3
|
4月前
|
JSON 中间件 Go
go语言后端开发学习(四) —— 在go项目中使用Zap日志库
本文详细介绍了如何在Go项目中集成并配置Zap日志库。首先通过`go get -u go.uber.org/zap`命令安装Zap,接着展示了`Logger`与`Sugared Logger`两种日志记录器的基本用法。随后深入探讨了Zap的高级配置,包括如何将日志输出至文件、调整时间格式、记录调用者信息以及日志分割等。最后,文章演示了如何在gin框架中集成Zap,通过自定义中间件实现了日志记录和异常恢复功能。通过这些步骤,读者可以掌握Zap在实际项目中的应用与定制方法
158 1
go语言后端开发学习(四) —— 在go项目中使用Zap日志库
|
4月前
|
算法 NoSQL 中间件
go语言后端开发学习(六) ——基于雪花算法生成用户ID
本文介绍了分布式ID生成中的Snowflake(雪花)算法。为解决用户ID安全性与唯一性问题,Snowflake算法生成的ID具备全局唯一性、递增性、高可用性和高性能性等特点。64位ID由符号位(固定为0)、41位时间戳、10位标识位(含数据中心与机器ID)及12位序列号组成。面对ID重复风险,可通过预分配、动态或统一分配标识位解决。Go语言实现示例展示了如何使用第三方包`sonyflake`生成ID,确保不同节点产生的ID始终唯一。
128 0
go语言后端开发学习(六) ——基于雪花算法生成用户ID
|
4月前
|
JSON 缓存 监控
go语言后端开发学习(五)——如何在项目中使用Viper来配置环境
Viper 是一个强大的 Go 语言配置管理库,适用于各类应用,包括 Twelve-Factor Apps。相比仅支持 `.ini` 格式的 `go-ini`,Viper 支持更多配置格式如 JSON、TOML、YAML
100 0
go语言后端开发学习(五)——如何在项目中使用Viper来配置环境
|
4月前
|
缓存 JavaScript 前端开发
为开源项目 go-gin-api 增加 WebSocket 模块
为开源项目 go-gin-api 增加 WebSocket 模块
50 2
|
4月前
|
JSON Go 数据格式
Go - httpclient 常用操作
Go - httpclient 常用操作
75 2
|
4月前
|
JSON 编解码 中间件
go-zero代码生成器助你高效开发
go-zero代码生成器助你高效开发