【Golang】go mod tidy无法拉取私有库
今天在windows下clone代码后,执行go mod tidy
,然后就提示需要输入密码,输完还是报错了。
错误如下:
fatal: Cannot prompt because user interactivity has been disabled.
remote: HTTP Basic: Access denied
fatal: Authentication failed for 'https://git.xxx.com/iot/kafka_wrapper.git/'
...
fatal: Cannot prompt because user interactivity has been disabled.
remote: HTTP Basic: Access denied
remote: You must use a personal access token with 'read_repository' or 'write_repository' scope for Git over HTTP.
remote: You can generate one at https://git.querycap.com/-/profile/personal_access_tokens
fatal: Authentication failed for 'https://git.xxx.com/iot/kafka_wrapper.git/'
1.对比排错
之前完全配置好的mac环境下就完全正常,查了一下git的config
,确实有不同
git config --global --list
通过公司的文档得知,github
上的代码若使用https
的仓库地址,会触发github
的频率限制,当然博主是没有遇到过这种情况,另外,私有仓库也需要账户密码(难怪)。所以全局把https
替换为ssh
,走公私钥校验:
git config --global url."git@github.com:".insteadOf "https://github.com/"
git config --global url."git@git.xxx.com:".insteadOf "https://git.xxx.com/"
2.补充
而对于 golang.org上的代码,在这一阶段,会从 https://go.googlesource.com获取代码,不过,这些代码都在github
上有镜像,也可以替换一下:
git config --global url."git@github.com:golang/".insteadOf "https://go.googlesource.com/"
3.扩展
通常我们会对go进行配置国内的镜像:
export GOPROXY=https://goproxy.cn,direct
export GOSUMDB=sum.golang.google.cn
export GOPRIVATE=git.xxx.com
go env -w GOPROXY=https://goproxy.cn,direct
go env -w GOSUMDB=sum.golang.google.cn
go env -w GOPRIVATE=git.xxx.com
3.1 GOPRIVATE
在完成配置后,go 命令会从公共镜像goproxy.cn
上下载依赖包,并且会对下载的软件包和代码库进行安全校验,当代码库是公开的时候,这些功能都没什么问题。但是如果仓库是私有的怎么办呢?环境变量 GOPRIVATE
就是用来控制go命令:配置私有仓库地址,这样的话,就可以跳过proxy server
和校验检查,这个变量的值支持用逗号分隔,可以填写多个值。
3.2 GOSUMDB
为了保证开发者的依赖库不被人恶意劫持篡改,Go team 推出了 Go module checksum database。服务器地址为:sum.golang.org。当你在本地对依赖进行变动(更新/添加)操作时,Go 会自动去这个服务器进行数据校验,保证你下的这个代码库和世界上其他人下的代码库是一样的。如果有问题,会有个大大的安全提示。当然背后的这些操作都已经集成在 Go 里面了,开发者不需要进行额外的操作。go会尝试对每一次依赖包下载操作进行验证,从而保证下载的依赖包始终是一致的。这样就保证了每一次的编译都是可重复的,也能很好的发现异常的变更。和 go.mod
一样,Go 会维护一个名为 go.sum
的文件,它包含了对依赖包进行计算得到的校验值。如果 go.sum
中的校验匹配失败了,Go 在编译下载的时候会给出提示,不一样了。
如果代码仓库或者模块是私有的,那么它的校验值不应该出现在互联网的公有数据库里面,但是本地编译的时候默认所有的依赖下载都会去尝试做校验,这样不仅会校验失败,更会泄漏一些私有仓库的路径等信息,我们可以使用 GONOSUMDB
这个环境变量来设置不做校验的代码仓库。记住是GONOSUMDB
,它就像GOPRIVATE
一样,校验时,会跳过这些私有库。
- 原文作者:Garfield
- 原文链接:http://www.randyfield.cn/post/2021-11-05-go-mod-git/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。