go get命令及下载异常处理

go get 命令可以借助代码管理工具通过远程拉取或更新代码包及其依赖包,并自动完成编译和安装。整个过程就像安装一个 App 一样简单。

这个命令可以动态获取远程代码包,目前支持的有 BitBucket、GitHub、Google Code 和 Launchpad。在使用 go get 命令前,需要安装与远程包匹配的代码管理工具,如 Git、SVN、HG 等,参数中需要提供一个包名。

命令参数

1
2
3
4
5
6
7
8
参数介绍:
-d 只下载不安装
-f 只有在你包含了 -u 参数的时候才有效,不让 -u 去验证 import 中的每一个都已经获取了,这对于本地 fork 的包特别有用
-fix 在获取源码之后先运行 fix,然后再去做其他的事情
-t 同时也下载需要为运行测试所需要的包
-u 强制使用网络去更新包和它的依赖包
-v 显示执行的命令
-insecure 允许使用不安全的 HTTP 方式进行下载操作

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ go get -insecure -v github.com/gin-gonic/gin
go: downloading github.com/gin-gonic/gin v1.6.3
go: github.com/gin-gonic/gin upgrade => v1.6.3
go: downloading github.com/gin-contrib/sse v0.1.0
go: downloading github.com/mattn/go-isatty v0.0.12
go: downloading gopkg.in/yaml.v2 v2.2.8
go: downloading github.com/ugorji/go v1.1.7
go: downloading github.com/golang/protobuf v1.3.3
go: downloading github.com/go-playground/validator/v10 v10.2.0
go: downloading github.com/json-iterator/go v1.1.9
go: downloading golang.org/x/sys v0.0.0-20200116001909-b77594299b42
go: downloading github.com/ugorji/go/codec v1.1.7
go: downloading github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb4
......

go get 取包原理

正则匹配出依赖包的查询路径

以包路径github.com/liujianping/foo为例,正则匹配后,得出的查询路径就是:https://github.com/liujianping/foo
再结合go-get参数,向远端VCS系统发起https://github.com/liujianping/foo?go-get=1请求。

查询得出包的远端仓库地址

包的远端仓库地址,可以通过go get请求的响应中的go-import的meta标签中的content中获取的。

示例:

1
2
$: curl https://github.com/liujianping/foo?go-get=1 | grep go-import
<meta name="go-import" content="github.com/liujianping/foo git https://github.com/liujianping/foo.git">

根据仓库地址clone到本地

go get命令在go mod目录下与正常目录执行的区别

错误处理

package golang.org/x/crypto/sha3: unrecognized import

package golang.org/x/crypto/sha3: unrecognized import path “golang.org/x/crypto/sha3”: http/https fetch: Get “http://golang.org/x/crypto/sha3?go-get=1": read tcp 172.24.107.53:54865->216.239.37.1:80: wsarecv: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.

解决方案,设置代理:

1
2
# export GOPROXY=https://goproxy.io
# export GO111MODULE=on

C:\Users\MrWang\go\src\github.com\gin-gonic\gin\binding\protobuf.go:11:2: cannot find package “github.com/golang/protobuf/proto” in any of:
E:\env\Go\src\github.com\golang\protobuf\proto (from $GOROOT)
C:\Users\MrWang\go\src\github.com\golang\protobuf\proto (from $GOPATH)
C:\Users\MrWang\go\src\github.com\go-playground\validator\baked_in.go:20:2: cannot find package “golang.org/x/crypto/sha3” in any of:
E:\env\Go\src\golang.org\x\crypto\sha3 (from $GOROOT)
C:\Users\MrWang\go\src\golang.org\x\crypto\sha3 (from $GOPATH)

下载指定版本的包

1
go get github.com/beego/beego/v2@v2.0.0

goLang命令

https://zhuanlan.zhihu.com/p/62893405

-------------本文结束感谢您的阅读-------------