golang依赖包下载失败?试试GO依赖管理工具go Modules配置goproxy代理

一.前言

初学者使用golang的时候可能会遇到这样几个问题

1.在使用go get的时候,由于一些众所周知的原因,经常会下载失败
2.拿到一个项目,很难知道使用了哪些依赖库,这些依赖库都是什么版本的
3.go的项目必须放在gopath下面,我想放在任意目录下

如果你有相同的疑问,那么go Modules就能很好的解决这些问题

二. Go Modules有哪些特点

  • Go Modules是官方正式推出的包依赖管理项目,由Russ Cox (即Go 现在的掌舵人)推动,dep是“official experiment”仅此而已。

  • Go modules 出现的目的之一就是为了解决 GOPATH 的问题,也就相当于是抛弃 GOPATH 了。以前项目必须在 G O P A T H / s r c 里 进 行 , 现 在 G o 允 许 在 GOPATH/src 里进行,现在Go 允许在 GOPATH/srcGoGOPATH/src外的任何目录下使用 go.mod 创建项目。当然现在

  • 随着模块一起推出的还有模块代理协议(Module proxy protocol),通过这个协议我们可以实现 Go 模块代理(Go module proxy),也就是依赖镜像。

  • Tag必须遵循语义化版本控制,如果没有将忽略 Tag,然后根据你的 Commit 时间和哈希值再为你生成一个假定的符合语义化版本控制的版本号。

  • Go modules 还默认认为,只要你的主版本号不变,那这个模块版本肯定就不包含 Breaking changes,因为语义化版本控制就是这么规定的啊。

  • Global Caching 这个主要是针对 Go modules 的全局缓存数据说明,如下:
    同一个模块版本的数据只缓存一份,所有其他模块共享使用。
    目前所有模块版本数据均缓存在 $GOPATH/pkg/mod和 $GOPATH/pkg/sum 下,未来或将移至 G O C A C H E / m o d 和 GOCACHE/mod和 GOCACHE/modGOCACHE/sum 下( 可能会在当 $GOPATH 被淘汰后)。
    可以使用 go clean -modcache 清理所有已缓存的模块版本数据。

    另外在 Go1.11 之后 GOCACHE 已经不允许设置为 off 了,我想着这也是为了模块数据缓存移动位置做准备,因此大家应该尽快做好适配。

如果你的版本是go1.12或更早版本,这里建议升级到go1.13,来体验一把go modules,看它能给你带来哪些方面身心的愉悦。

三.如何使用Go Modules

1.首先安装Go 1.13或升级到Go 1.13

2.配置环境变量

#打开 Go modules,如果你担心影响到其他项目可以把这一项值写为auto
go env -w GO111MODULE=on
#设置 GOPROXY
go env -w GOPROXY=https://goproxy.cn,direct

3.配置gomod

找到你项目的根目录执行

	go mod init

后会自动生成go.mod文件在这里插入图片描述之后运行你的项目就会将依赖包自动下载下来了,go.mod中会自动生成依赖代码,main.go我使用的gin框架为例。

在这里插入图片描述在这里插入图片描述

四.配置goland

此时你的项目已经可以正常运行了,但是你可能会遇到三方库代码飘红问题,此时只需要将goland的GoModule打开就可以了
在这里插入图片描述

五.其他你可能需要知道的知识

1.go.sum

项目中增加了还go.sum文件,这个文件有什么用?
go.sum文件内容

github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
github.com/gin-gonic/gin v1.6.3 h1:ahKqKTFpO5KTPHxWZjEdPScmYaGtLo8Y4DMHoEsnp14=
github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M=
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q=
github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no=
github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY=
github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI=
github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I=
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y=
github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo=
github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs=
github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=

go.sum类似于比如 dep 的 Gopkg.lock 的一类文件,它详细罗列了当前项目直接或间接依赖的所有模块版本,并写明了那些模块版本的 SHA-256 哈希值以备 Go在今后的操作中保证项目所依赖的那些模块版本不会被篡改。

2.更换依赖版本

首先你需要查看对应依赖库的历史版本有什么?你可以访问对应github网站查看历史版本,也可以在项目根目录下执行以下命令获取

执行
go list -m -versions github.com/gin-gonic/gin
返回
github.com/gin-gonic/gin v1.1.1 v1.1.2 v1.1.3 v1.1.4 v1.3.0 v1.4.0 v1.5.0 v1.6.0 v1.6.1 v1.6.2 v1.6.3

如果想更换依赖版本,比如v1.6.0,怎么办?
只需执行如下命令

go mod edit -require="github.com/gin-gonic/gin@v1.6.0"
go mod  tidy #更新现有依赖

当然,还有一种更简单办法,可以直接修改go.mod的引用
require github.com/gin-gonic/gin v1.6.0

3.gomod相关命令

go mod download 下载 go.mod 文件中指明的所有依赖

go mod tidy 整理现有的依赖,删除未使用的依赖。

go mod graph 查看现有的依赖结构

go mod init 生成 go.mod 文件 (Go 1.13 中唯一一个可以生成 go.mod 文件的子命令)

go mod edit 编辑 go.mod 文件

go mod vendor 导出现有的所有依赖 (事实上 Go modules 正在淡化 Vendor 的概念)

go mod verify 校验一个模块是否被篡改过

go clean -modcache 清理所有已缓存的模块版本数据。

go mod 查看所有 go mod的使用命令

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Golang中,我们可以使用`go get`命令来下载和安装依赖。然而,有些情况下,我们可能需要在没有网络连接的情况下进行依赖下载。以下是一种解决方案来进行Golang离线依赖下载: 1. 配置代理服务器:在有网络连接的情况下,配置一个代理服务器来捕获所有的网络请求并缓存下载依赖。这样,我们就可以将缓存的依赖复制到离线环境中使用。常用的代理服务器有`mod`和`goproxy`等。 2. 在有网络连接的机器上通过`go get`下载依赖:使用具有网络连接的机器,通过`go get`命令下载所需的依赖。例如,如果要下载`github.com/gin-gonic/gin`,可以执行以下命令: ``` go get -u github.com/gin-gonic/gin ``` 这将会在GOPATH下的`src`文件夹中下载并安装该依赖。 3. 将依赖复制到离线环境中:一旦依赖下载到有网络连接的机器上,找到对应的文件夹(在`GOPATH/src`下)并将其复制到离线环境中。可以使用USB存储设备等将依赖复制到离线环境中。 4. 配置离线环境的GOPATH:在离线环境中,设置一个新的GOPATH。在该环境中,将GOPATH设置为离线环境中复制的依赖文件夹的路径。 5. 使用依赖:在离线环境中,我们现在可以在代码中使用已下载依赖。使用`import`语句导入所需的名,然后正常地在代码中使用它们。 虽然这种方法可以实现Golang离线依赖下载,但是需要记录和处理依赖关系,以确保所有依赖都被下载并正确地复制到离线环境中。所以,它可能在处理大型项目时变得复杂。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值