前言
虽然在之前的文章有写过,怎么在 windows 7 上通过 docker 来实现多个 golang 环境, 并使用了 Go Module:
但是事实上在本机进行开发的时候,还是本地环境装的 golang 环境开发起来更方便 (macOS 还好,差别不大,但是 windows 7 的 docker 实在不怎么友好), 所以就打算将本机环境的 golang 版本升级到 1.13 版本。
升级 golang 版本
1.7.6
1
2
F:\airdroid_code\go\src\resque-worker-server>go version
go version go1.7.4 windows/amd64
查看了一下,原环境的 GOROOT 和 GOPATH 路径:
1
2
3
set GOPATH=F:\airdroid_code\go
set GORACE=
set GOROOT=C:\Go
1.141.131.13.8msi
yes
最后安装完之后,执行一下命令:
1
2
F:\airdroid_code\web-readme>go version
go version go1.13.8 windows/amd64
F:\airdroid_code\go
而我们看了一下, admin 下的用户变量,确实是用户目录下的目录。 所以这个要改一下,改过来
改成
go env
找个项目试一下
接下来就找一个项目试一下,go module 是否正常。 之前的 GOPATH 目录下的 pkg 只有这两个目录:
当用 go module 安装之后:
1
2
3
4
5
6
7
8
F:\airdroid_code\go\src\resque-worker-server>go build
go: downloading github.com/robfig/cron v1.2.0
go: downloading gitlab.airdroid.com/airdroid-utils/goworker v0.0.0-20200219070700-6eb070ff12d8
go: downloading gitlab.airdroid.com/airdroid-utils/iGong v1.3.5
...
go: finding golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b
build gitlab.airdroid.com/airdroid_background/resque-worker-server: cannot load github.com/youtube/vitess/go/pools: github.com/youtube/vitess@v2.1.1+incompatible: read tcp 192.168.40.51:56366->172.217.160.80:443: wsarecv: An esta
blished connection was aborted by the software in your host machine.
github.com/youtube/vitess/go/pools
goproxy
我用的第二种,就是修改 proxy 地址, 原先设置的默认地址是:
1
2
$ go env | grep proxy
set GOPROXY=https://proxy.golang.org,direct
后面改成:
1
go env -w GOPROXY=https://goproxy.cn,direct
这样就修改成功了:
1
2
$ go env | grep proxy
set GOPROXY=https://goproxy.cn,direct
然后重新 go build 编译一下,这时候就正常了:
1
2
3
4
5
6
7
F:\airdroid_code\go\src\resque-worker-server>go build
go: downloading github.com/youtube/vitess v2.1.1+incompatible
go: extracting github.com/youtube/vitess v2.1.1+incompatible
go: downloading github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b
go: extracting github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b
go: finding github.com/youtube/vitess v2.1.1+incompatible
go: finding github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b
.exe
$GOPATH/pkg/mod
这边有个细节就是,因为这个项目有拉取内部库的包,正常情况下是要配置 GOPRIVATE 这个配置,让 go 在拉包的时候, 直接采用直连去拉包, 之前在 docker 容器配置 gitlab ssh 遇到的问题 就是这样配的。
1
go env -w GOPRIVATE=*.airdroid.com
但是这次并不需要这样配(所以我这个配置还是空的):
1
2
$ go env | grep PRIVATE
set GOPRIVATE=
这个是因为我用了另外一个机制,就是 git 配置了:
1
git config --global url."git@gitlab.airdroid.com:".insteadOf "http://gitlab.airdroid.com/"
这时候只要是内部包的拉取,都会从 http 下载方式转换为 ssh 的下载方式,直接通过本机的 ssh 配置进行请求。从而绕过了 GOPRIVATE 设置。
1
2
$ git config --list | grep url
url.git@gitlab.airdroid.com:.insteadof=http://gitlab.airdroid.com/
而且通过这种方式还可以避免内部库是 http 的问题,因为下载包的时候,只能是 https 协议,如果是 http 协议,那么拉包的时候,就会报错。
IDE 识别当前项目的 GO Module 依赖路径
虽然可以进行构建了。但是我发现在我的 IDE 中 (用的是 IntelliJ IDEA), 如果是其他项目的依赖还好,可以识别,但是如果是本项目的内部依赖,这时候就会识别不了:
这个项目在 go.mod 中的名字就是
1
module gitlab.airdroid.com/airdroid_background/resque-worker-server
但是这个 IDE 在加载这个依赖的时候,没办法认出这其实是本项目的代码。而是去 pkg/mod 中去找,那肯定是找不到。 而且发现 setting 中也没有关于 GO Module 的相关配置:
后面打算换同系列中,但是专门用于 golang 项目的 Goland IDE。 安装完之后,发现还是爆红,不过我发现他有在 拉包,可能在加载索引吧:
看了一下 setting, 终于发现有 Go Module 相关的配置了,不过发现proxy 竟然设置的是直连, 难怪会慢了。
而且这边跟 cmd 里面的 GOPROXY 设置的不一样。 所以我就改成一样了:
最后重启了一下机子,发现下载也正常了,本项目依赖包的识别也正常了, 代码跳转也正常了:
所以后面 golang 项目,只能用 Goland 这个 IDE 了。 不过也有可能是我用的 IDEA 的版本太旧了。新版本可能有兼容 GO Module 的配置,这个后面有空再试下。