概述
- 当我们在使用
import
导入包的时候,无法指定版本号,但我们知道不同版本的包存在大大小小的差异,版本不可控是十分危险的。因此我们需要使用module模式来进行版本控制。 - 使用:需要将代码仓库放到环境变量的
GOPATH/src
目录外,然后在代码目录下创建一个go.mod
文件,然后在代码目录下执行go
命令。
go mod文件内容
- module 当前模块名称
- go 版本号
- require 所需第三方库
go mod命令
输入go mod help
可以查看到所有go mod命令:以下命令前缀是go mod
- init:生成go.mod文件
- download:下载go.mod文件中指明的所有依赖
- tidy:整理现有的依赖
- graph:查看现有的依赖结构
- edit:编辑go.mod文件
- vendor:导出项目所有的依赖到vendor目录
- verity:校验一个模块是否被篡改过
- why:查看为什么需要依赖某模块
go mod环境变量
可以通过命令go env
查看go mod的环境变量,常用的有以下几个环境变量
GO111MODULE
go在1.1.1版本后才有moudle模式,因此起名111。
允许设置为以下参数:使用命令go env -w GO111MODULE=on
设置
- auto:只要项目包含go.mod文件的话启用Go module。Go1.11-1.14的默认值。
- on:启用Go module。目前(1.17)默认值。
- off:禁用Go module。
GOPROXY
主要用于设置模块代理,可以通过设置的网站,快速拉取模块版本。第三方依赖库下载的源地址。
默认值是:https://proxy.golang.org,direct(国内无法访问)
常见的国内代理有:使用命令go env -w GOPROXY=https://goproxy.cn,direct
设置
(1)阿里云:https://mirrors.aliyun.com/goproxy/
(2)七牛云:https://goproxy.cn,direct
添加direct
的话,如果当前代理路径找不到,会到包所在的原路径找。
查看当前值:go env|grep GOPROXY
注意:设置的镜像地址GOPROXY,同时也会代理GOSUMDB的检查工作,因此可以不用重复设置GOSUMDB。
GOSUMDB
用于在拉取模块版本的时候,保证拉取到的数据未经过篡改。如果发现不一致,即可能发现篡改,将会立即终止。
默认值是:sum.golang.org(国内无法访问)
查看当前值:go env|grep GOSUMDB
如果不希望校验,将该值改为off
该值能够被Go模块代理所代理,因此我们可以通过GOPROXY来解决默认值无法直接访问的问题,因此设置GOPROXY后,无需额外设置。
GOPRIVATE
当项目依赖了私有模块,需要设置GOPRIVATE来指明某一个或一类私有模块,GOPRIVATE设置的值会作为GONOPROXY和GONOSUMDB的默认值,这样不会被GOPROXY指定的Go模块代理,也不会被GOSUMDB指定地址检查。
该值可以设置多个,多个间通过英文逗号","分割。也可以使用通配符,设置某一类。
$ go env -w GORIVATE="*.example.com,git.text.com"
初始化项目并使用第三方库
学习视频:https://www.bilibili.com/video/BV1gf4y1r79E?p=35
前提:开启了Go Moudules模块
查看当前值:go env|grep GO111MODULE
,当前值必须为on
方式一:执行命令go env -w GO111MODULE=on
方式二:在用户启动脚本(环境变量)中添加export GO111MODULE=on
,保存后需要执行source ~/.bashrc
初始化项目
- 任意文件夹下创建一个项目(无需在$GOPATH/src下):
mkdir -p 项目路径/项目名称
- 生成go.mod文件:
go mod init 项目路径/项目名称
go.mod文件内容中只有当前模块名称和go版本号。 - 在项目中编写源代码
导入第三方库
- 在项目中编写的源代码依赖某个第三方库,需要down
· 手动:go get 第三方库路径
,可以指定版本号
· 自动 - 成功后会看到go.mod文件中添加了新代码,
require 第三方库路径 版本号
,可能末尾还添加了//indirect
,表示间接依赖,依赖其中的某一部分。 - 导入后会生成一个go.sum文件。
go.sum文件的作用:罗列当前项目直接或间接依赖的所有模块版本,保证今后项目依赖的版本不会被篡改,其中会生成一些hash值。
·第三方库 版本号 h1:hash
是利用依赖库的全部文件的校验和生成的hash,如果不存在,可能表示依赖的库用不上。
·第三方库 版本号/go.mod h1:hash
仅用go.mod文件做的hash,一定存在。
改变模块依赖关系
当我们模块依赖的是A,但我们想修改为B的时候,我们可以改变模块依赖关系
使用go mod edit -replace=原依赖=替换依赖
命令,这时候go.mod文件会多一行replace 原依赖 => 替换依赖
。