【Go快速入门】— go modules模块管理

Go Alice 2年前 (2022-04-04) 528次浏览 0个评论

一、Go Modules

1、什么是 Go Modules

Go modules 是 Go 语⾔的依赖解决⽅案。

发布于 Go1.11,成⻓于 Go1.12,丰富于 Go1.13,正式于 Go1.14 推荐在⽣产上使⽤。

Go modules 目前集成在 Go 的工具链中,只要安装了 Go 就可以使用。

Go modules 的出现解决了在 Go1.11 前的几个常见争议问题:

  • Go 语言长久以来的依赖管理问题。
  • “淘汰” 现有的 GOPATH 的使用模式。
  • 统一社区中其他的依赖管理工具(提供迁移功能)。

2、GOPATH 的⼯作模式

什么是 GOPATH?

  表示当前 Go 语言的全部项目的所在路径

$ go env

GOPATH="/home/saber/go"
...
GOPATH 的弊端:

  • 无版本控制概念
  • 无法同步一致第三方版本号
  • 无法指定当前项⽬引用的第三⽅版本号

Go Modules 的目的之一就是淘汰 GOPATH。

二、Go Modules 模式

1、go mod 命令

命令 作用
go mod init 生成 go.mod 文件
go mod download 下载 go.mod 文件中指明的所有依赖
go mod tidy 整理现有的依赖
go mod graph 查看现有的依赖结构
go mod edit 编辑 go.mod 文件
go mod vendor 导出项目所有的依赖到 vendor 目录
go mod verify 检验一个模块是否被篡改过
go mod why 查看为什么需要依赖某模块

2、go mod 环境变量

通过go env来查看环境变量

$ go env
GO111MODULE="auto"
GOPROXY="https://proxy.golang.org,direct"
GONOPROXY=""
GOSUMDB="sum.golang.org"
GONOSUMDB=""
GOPRIVATE=""
...

1)、GO111MODULE

表示是否开启 Go modules 模式,允许设置以下参数:

  • auto:只要项目包含了 go.mod 文件就启用 Go Modules。
  • on:启用 Go modules ,推荐设置。
  • off:禁用 Go modules,不推荐。

建议 go v1.11 后,都设置为 on:

go env -w GO111MODULE=on

2)、GOPROXY

这个环境变量主要是用于设置Go 模块代理,其作用是用于使 Go 在后续拉取模块版本时直接通过镜像站点来快速拉取。

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

proxy.golang.org 国内访问不了,需要设置国内的代理。

  • 阿里云:https://mirrors.aliyun.com/goproxy/
  • 七牛云:https://goproxy.cn,direct

如:

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

GOPROXY 的值是一个以英文逗号”,“分割的 Go 模块代理列表,允许设置多个模块代理。如:

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

3)、GOSUMDB

⽤来校验拉取的第三⽅库是否是完整的。

在拉取模块版本时(无论是从源站拉取还是通过 Go 模块代理拉取)保证拉取到的模块版本数据未经过篡改,若发现不一致,也就是可能存在篡改,将会立即中止。

GOSUMDB 的默认值为:sum.golang.org,在国内也是无法访问的。但是 GOSUMDB 可以被 Go 模块代理所代理,如果设置了 GOPROXY,这个就不⽤设置了。

4)、GONOPROXY / GONOSUMDB / GOPRIVATE

这三个环境变量都是用在当前项目依赖了私有模块,都需要进行设置,否则会拉取失败。

一般建议直接设置 GOPRIVATE,它的值将作为 GONOPROXY 和 GONOSUMDB 的默认值,所以建议的最佳姿势是直接使用 GOPRIVATE。

并且它们的值都是一个以英文逗号”,“分割的模块路径前缀,也就是可以设置多个,例如:

go env -w GOPRIVATE="git.example.com,github.com/aceld/zinx"

如果不想每次都重新设置,可以利用通配符,例如:

go evn -w GOPRIVATE="*.example.com"

三、使用 Go Modules 初始化项目

1、开启 Go Modules

通过下面的命令保证GO111MODULE=on

go env -w GO111MODULE=on

又或是可以通过直接设置系统环境变量(写入对应的~/.bashrc文件亦可)来实现这个目的:

export GO111MODULE=on

2、初始化项目

1)、任意文件夹创建一个项目(不要求在$GOPATH/src 下)

mkdir -p $HOME/saber/modules_test

2)、创建 go.mod 文件,同时为当前项目的模块命名

go mod init github.com/aceld/modules_test

【Go 快速入门】—  go modules 模块管理
3)、就会生成一个 go.mod 文件

module github.com/saber/modules_test #模块名称

go 1.14 #版本号

4)、在该项目编写源代码,如果源代码中依赖某个库(比如:github.com/aceld/zinx/znet),可以手动下载,也可以自动下载

# 手动下载
go get github.com/aceld/zinx/znet

【Go 快速入门】—  go modules 模块管理
5)、下载后,go.mod 文件会添加一行新代码

module github.com/saber/modules_test

go 1.14

require github.com/aceld/zinx v1.0.1 // indirect

6)、同时会生成一个 go.sum 文件

github.com/aceld/zinx v1.0.1 h1:WnahGyE7tDJvkJRVK2VI/m57aHEeUjr12EAYpOYW3ng=
github.com/aceld/zinx v1.0.1/go.mod h1:Tth0Fmjjpel0G8YjCz0jHdL0sXlc4p3Km/l/srvqqKo=
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=

四、修改模块依赖关系

通过下列命令,修改项目模块的版本依赖关系

go mod edit -replace=zinx@v1.0.1=zinx@v1.0.2

go.mod 文件就会被修改

module github.com/saber/modules_test

go 1.14

require github.com/aceld/zinx v1.0.1 // indirect

replace zinx v1.0.1 => zinx v1.0.2

 

分享:Golang 学习视频地址:8 小时转职 Golang 工程师(如果你想低成本学习 Go 语言)


女程序员博客 , 版权所有丨本站采用BY-NC-SA协议进行授权 , 转载请注明【Go 快速入门】— go modules 模块管理

【声明】:本博客仅为分享信息,不参与任何交易,也非中介,所有内容仅代表个人观点,均不作直接、间接、法定、约定的保证,读者购买风险自担。一旦您访问本博客,即表示您已经知晓并接受了此声明通告。

【关于安全】:任何 IDC 都有倒闭和跑路的可能,备份永远是最佳选择,服务器也是机器,不勤备份是对自己极不负责的表现,请保持良好的备份习惯。

喜欢 (1)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址