1. go mod开启
1.1. 开启go mod
go Modules是Go 1.11中新增的实验性功能,是一种新型的包管理工具,可以方便的包版本化管理。使用go mod,首先要把go升级到1.11版本以上。然后环境变量中需要设定好GOPATH以及GOROOT。
随后可以通过一个命令或设置环境变量GO111MODULE来激活go modules:
1 2 3 4 5 6 7 8 9 10 |
#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 命令下载。
1 |
go get -u -v github.com/sirupsen/logrus |
1.2. 开启go的中国下载代理
在中国很多的go依赖模块无法下载,使用。通过切换中国的GO代理,进行go编码,其中存有大多GO编码模块。可以点击进入查看,https://goproxy.cn/
1 |
go env -w GOPROXY=https://goproxy.cn,direct |
2. 项目中使用go mod
1 2 3 4 5 6 7 |
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
;
1 2 |
//在project-2y引入module1时 import "github.com/project-1/module1" |
2.2. 方法二:replace替换路径
1 2 3 4 5 6 7 8 |
//进入项目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代码
1 2 3 4 5 |
module project-2 //这个./module1路径需要根据实际路径关系修改,项目中会自动将project-1替换为gitee.com/project-1 replace module1 => gitee.com/project-1 go 1.13 require (...) |
最后通过 project-2入口函数,引用包project-1即可;这种适用于强迫症人士,保持代码整洁一致性
1 2 |
//在项目project-2中引用module1 import "module1" |
3. go mod 常用命令
1 2 3 4 5 6 7 8 9 |
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指定包版本号,比如:
1 |
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-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版本。
1 2 3 4 5 6 |
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版本号
1 2 3 4 5 6 7 8 |
#添加指定版本号的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
微信赞赏
支付宝赞赏