Golang 源使用方法
1. 简介
Golang 源的搭建主要是为了解决在LoongArch64 平台上编译golang项目对sys和net的依赖问题.
2. Golang 源使用方法
先确认当前 go 项目在编译时使用的sys和net,是否为go项目中vendor路径下的sys和net.
2.1. 打开GO111MODULE
若使用vendor路径下的sys和net,先打开GO111MODULE:
go env -w GO111MODULE=on
2.2. 生成 go.mod 文件:
go mod init
若项目中带有 go.sum 文件,则删除该文件
2.3. 配置源
go env -w GOPROXY=http://goproxy.loongnix.cn:3000
2.4. 关闭校验
go env -w GOSUMDB=off
2.5. 执行编译
- 若项目在使用sys和net的时候是从官方网址拉取的, 则省略步骤 2.1 和 2.2.
- 若 go 项目使用 vendor 路径下的sys和net,而且sys和net依赖的版本较少时, 则也可以先从源上获取sys和net的源码, 然后替换
vendor路径下的sys和net源码,再执行编译即可. 获取方式如下(以 net v0.0.0-20200324143707-d3edc9973b7e 版本为例):
当执行完这两条命令后 net 的源码将下载到$GOPATH/pkg/mod 下面.go env -w GOPROXY=http://goproxy.loongnix.cn:3000 go get golang.org/x/net@v0.0.0-20200324143707-d3edc9973b7e
3. 常见问题处理
3.1. 缓存清除问题
若已经按照上面的方法设置 GOPROXY,但在编译时仍然报错:
../../../go/pkg/mod/golang.org/x/sys@v0.0.0-20190215142949-d0b11bdaac8a/unix/affinity_linux.go:13:20: undefined: _CPU_SETSIZE
../../../go/pkg/mod/golang.org/x/sys@v0.0.0-20190215142949-d0b11bdaac8a/unix/affinity_linux.go:13:35: undefined: _NCPUBITS
这是由于没有清除本地缓存导致,清除本地$GOPATH/go/pkg/ 后重新编译即可
3.2. 校验问题
若已经设置了 go env -w GOSUMDB=off,仍然出现以下校验错误,则删除 go.sum 文件
go: downloading golang.org/x/tools v0.0.0-20190611222205-d73e1c7e250b
go: downloading golang.org/x/sys v0.0.0-20210331175145-43e1dd70ce54
verifying golang.org/x/sys@v0.0.0-20210331175145-43e1dd70ce54: checksum mismatch
downloaded: h1:5HZZhvdNN0O5KldlyABQ6eFwlX3k1RRGy0D+JtnQ0zU=
go.sum: h1:rF3Ohx8DRyl8h2zw9qojyLHLhrJpEMgyPOImREEryf0=
3.3. GO111MODULE
当设置了GO111MODULE=on 后仍然从项目的 vendor 目录下读取文件,此时在 go 的编译参数中添加-mod=mod.
从go版本1.14及以上,在设置 GO111MODULE=on 的情况下,参数-mod 控制 go.mod 是否自动更新以及是否使用vendor目录.
-mod=mod:则忽略vendor目录并自动更新go.mod
-mod=readonly: 忽略vendor目录,并在go.mod需要更新时报告错误
-mod=vendor: 使用vendor目录
在go版本1.14以下, 当存在vendor目录时,-mod缺省情况下使用-mod=vendor. 具体可查看
3.4. 网络问题
若在使用过程中出现类似下面的2种错误,则是由于当前网络不稳定引起的,此时尝试重新拉取即可.
错误1:
go: github.com/Azure/azure-sdk-for-go@v55.2.0+incompatible/go.mod: verifying module: github.com/Azure/azure-sdk-for-go@v55.2.0+incompatible/go.mod: Get "http://goproxy.loongnix.org:3000/sumdb/sum.golang.org/supported": dial tcp: lookup goproxy.loongnix.org on 8.8.8.8:53: read udp 10.130.0.199:52782->8.8.8.8:53: i/o timeout
错误2:
golang.org/x/sys@v0.0.0-20200323222414-85ca7c5b95cd: reading http://goproxy.loongnix.org:3000/golang.org/x/sys/@v/v0.0.0-20200323222414-85ca7c5b95cd.mod: 500 Internal Server Error