1. go mod开启
1.1. 开启go mod
go Modules是Go 1.11中新增的实验性功能,是一种新型的包管理工具,可以方便的包版本化管理。使用go mod,首先要把go升级到1.11版本以上。然后环境变量中需要设定好GOPATH以及GOROOT。
随后可以通过一个命令或设置环境变量GO111MODULE来激活go modules:
#linux环境中,直接运行一下命令开启go mod.
#windos环境中进入powershell
go env -w GO111MODULE=on
#也可以直接设置环境变量
export GO111MODULE=on
#添加代理
go env -w GOPROXY=https://goproxy.cn,https://mirrors.aliyun.com/goproxy,direct
#export GOPROXY=https://goproxy.cn,https://mirrors.aliyun.com/goproxy,direct
当GO111MODULE=off时,go命令就不支持module功能,寻找依赖包的方式将会沿用旧版本那种通过vendor目录或者GOPATH模式来查找。
当module功能启用时,第三方依赖安装包下载的具体位置在$GOPATH/pkg/mod,可以使用go get 命令下载。
go get -u -v github.com/sirupsen/logrus
1.2. 开启go的中国下载代理
在中国很多的go依赖模块无法下载,使用。通过切换中国的GO代理,进行go编码,其中存有大多GO编码模块。可以点击进入查看,https://goproxy.cn/
go env -w GOPROXY=https://goproxy.cn,direct
2. 项目中使用go mod
GOPATH:
- src
- project-1
- module1
- vendor
- github.com/project-2
- pkg
假设目录关系如上。在project-1项目中,使用go mod.
2.1. 方法一:子模块相对路径引用
这里直接添加在项目中的相对路径,引用时注意包函数大小写,大写才能被外部引用;该路径是根据GOPATH/GOROOT的src目录中文件路径确认;例如$GOPATH/src/github.com/project-1
;
//在project-2y引入module1时
import "github.com/project-1/module1"
2.2. 方法二:replace替换路径
//进入项目project-1并初始化go mod管理工具
cd project-1
//这个init的模块名称最好是相对路径${GOPATH}/src的目录下,例如${GOPATH}/src/gitee.com/project-1
go mod init gitee.com/project-1
//若项目中有自定义子模块module1,则也需要进入该目录go mod管理该模块
cd project-2
go mod init gitee.com/project-2
然后再project-2项目的根目录生成的go.mod进行编写,添加replace代码
module project-2
//这个./module1路径需要根据实际路径关系修改,项目中会自动将project-1替换为gitee.com/project-1
replace module1 => gitee.com/project-1
go 1.13
require (...)
最后通过 project-2入口函数,引用包project-1即可;这种适用于强迫症人士,保持代码整洁一致性
//在项目project-2中引用module1
import "module1"
3. go mod 常用命令
go mod download //下载依赖包
go mod edit //工具或脚本编辑go.mod
go mod graph //打印模块依赖图
go mod init //在当前目录初始化mod
go mod tidy //拉取缺少的模块,移除不用的模块。
go mod vendor //将依赖复制到vendor下
go mod verify //验证依赖是否正确
go mod why //解释为什么需要依赖
go list -m -json all //依赖详情
4. go mod 指定并加载版本号
4.1. 方法一 go mod指定替换版本
在项目的go.mod中用replace指定包版本号,比如:
replace google.golang.org/grpc => google.golang.org/grpc v1.26.0
4.2. 方法二 go mod指定大小版本
- 配置下载相关依赖库及其版本
- 下载指定小版本v3.2011.1:
go get -u -x github.com/dgraph-io/badger/v3@v3.2011.1
可以在本地GOPATH中查看到具体路径/root/go/pkg/mod/github.com/dgraph-![](https://turbock79.cn/wp-content/uploads/2020/05/微信截图_20210701103527.png)io/badger/v3@v3.2011.1
,go mod会自动下载对应tag的指定节点;
- 配置依赖库及其指定版本
import导入时指定依赖大版本,项目中直接指定版本githubAddr/version,大版本号添加v1、v2等等,如后面不加/v等,则默认为v0或v1版本的大版本。该方法可以解决go get的时候报错invalid version: module contains a go.mod file, so major version must be compatible: should be v0 or v1, not v2
。该大版本主要依赖git项目Release版本。
import (
badger "github.com/dgraph-io/badger/v3"
cache "github.com/eko/gocache/v2/cache" //依赖子项采用如下方式
metrics "github.com/eko/gocache/v2/metrics"
store "github.com/eko/gocache/v2/store"
)
同时也可以通过以下指定依赖版本,但仅限小版本号。
go mod edit -require=github.com/dgraph-io/badger/v3@v3.2011.1
然后再go mod tidy
下载所以相关依赖,并删除不需要模块;
4.3. 方法三 go mod指定版本HASH值获取
通过浏览器获取想要获取版本的对应hash值,但是该方法对于版本更新不是很友好,需要不断调整。获取hash如下图
- 使用gobgp版本号
#添加指定版本号的hash获取该版本
go get github.com/osrg/gobgp@915bfc2
#查看go.mod版本,获取
require (
...
github.com/osrg/gobgp v0.0.0-20210402043138-915bfc2d8189 // indirect
...
)
参考文章:https://github.com/osrg/gobgp/issues/2274
本文源站地址链接:https://turbock79.cn/?p=1460