In this post, I would demo how to solve the below issue when using
go get . to install dependencies in golang application.
$ go get . go: finding module for package gopkg.in/yaml.v3 go: downloading gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b go: finding module for package gopkg.in/yaml.v3 person.go:5:2: gopkg.in/[email protected]: verifying module: gopkg.in/[email protected]: Get "https://sum.golang.org/lookup/gopkg.in/[email protected]": dial tcp 126.96.36.199:443: i/o timeout
The packages imported in source code:
import ( "fmt" "gopkg.in/yaml.v3" "io/ioutil" "os" )
But the package
gopkg.in/yaml.v3 can not be resolved:
Why did this happen?
- go version go1.14.2 darwin/amd64
3. The solution and solution
3.2 The solution
Let’d debug the problem.
First, let’s check the proxy settings in the environment:
$ go env|grep goproxy $
You can see that we have NOT set any proxy in our environment.
Then check the goproxy settings in goland:
I think the key point is that we should set a proxy for our go develop environment.
Lastly, we do the test again:
$ go get . go: finding module for package gopkg.in/yaml.v3 go: downloading gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b go: found gopkg.in/yaml.v3 in gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b github.com/goinaction/study/hello51
And now the packages are all parsed correctly.
3.3 The theory
According to faith’s article:
By default the
go command downloads modules from VCS’s directly, e.g. github.com. The
GOPROXY environment variable allows further control over the download source. The environment variable configures the
go command to use a Go module proxy.
To start using a Go module proxy, we need to set the
GOPROXY environment variable to a compatible Go module proxy. There are multiple ways:
GOPROXY is unset, empty or set to
go get will use a direct connection to the VCS (e.g github.com):
It can be also set to
off, which means no network use is allowed.
2.) You can start using a public Go proxy. One of your options is to use the Go proxy from the Go team (which is run by Google). More information can be found here: https://proxy.golang.org/
To start using it, all you have is to set the environment variable:
Other public proxies are:
GOPROXY=https://goproxy.io GOPROXY=https://goproxy.cn # proxy.golang.org is blocked in China, this proxy is not
3.) You can run several open source implementations and host it yourself. Some of these are:
You need to maintain these yourself. It’s up to you if you want to serve it over the public internet or on your internal network.
4.) You can pass a
file:/// URL. Because a Go module proxy is a web server that responds to GET requests (with no query parameters), a folder in any filesystem can be also used to serve as a Go module proxy.
In this post, I tried to demo how to
verifying module and dial tcp i/o timeout issue when using go get in golang applications , the key point is to set a goproxy for our developement environment.