Go 1.14解决Go Modules模式下更新私有库问题
在Go 1.11之后推出了依赖包管理工具Go Modules之后,Go项目可以在 GOPATH 之外的位置创建,当项目中仅使用了公有库作为依赖时,使用 go get 或 go mod 更新依赖一切如初,没有任何问题。
由于Go Modules默认使用代理去更新依赖,所以当使用了私有仓库作为依赖时,Go更新依赖的相关命令将不再可用。
通过以下配置,可以实现更新支持https协议的私有库依赖。
1. 设置 GOPRIVATE 环境变量 go env -w GOPRIVATE=private.repo.com
2. 修改git的全局配置
git config --global url."ssh://git@private.repo.com".insteadOf "https://private.repo.com"
然而如果私有库不支持https协议,会报如下的错误。这是因为Go更新依赖时,会强制校验CA证书来确保依赖库的安全性。
go: private.repo.com/modules/project@v0.0.0-20200320063051-28c4ad7fe2ea: unrecognized import path "private.repo.com/modules/project": https fetch: Get "https://private.repo.com/modules/project?go-get=1": dial tcp 123.123.123:443: connect: connection refused
如果要更新不支持https协议的私有库,还需再做如下的配置。
1. 需要对git的全局配置做出调整,将https改为http。
git config --global url."ssh://git@private.repo.com".insteadOf "http://private.repo.com"
2. 添加参数或环境变量。
1) 使用 go get -insecure
这种方式不推荐,原因如下
1. 添加 -insecure 参数即表示更新依赖时可以不去校验CA证书,但是这会带来一个问题:范围无法界定(overkill),所有与要更新依赖相关联的依赖,均不会去做校验,可能会意外更新到不安全的依赖。
2. -insecure 仅支持 go get 命令,不支持 go mod 命令,因此使用 go mod 命令时是无法更新不支持https协议的私有库的。
2) 添加 GOINSECURE 参数
推荐这种方式
在Go 1.14中增加了新的环境变量,用于指定哪些域名下的仓库不去校验CA证书。
使用方式同 GOPRIVATE 类似 go env -w GOINSECURE=private.repo.com
感受
这两天在家折腾Go语言,搞得我很怀疑人生,网上的好多博客都是使用旧版本Go的,在新版本出了一些新特性之后,很多方式都改了。第一次感受到我在紧跟一个开源项目的脚步,还是这么火的一个语言。
Go现在给我的感觉就是,它还在一个紧锣密鼓的开发阶段,一些特性,一些功能,还没有那么完善。就拿Go Modules来说,它是Go 1.11才推出的一个功能,截止到1.14,还未支持所有的Go Tools,GOINSECURE也是1.14才提供的一个参数,未来如何发展还是未知数。
Go的开源社区还是相当活跃的,好多疑问都可以在里面找到解答,甚至是官方的解答(找不到中文的博客,只能Google去看Github和Stack Overflow,英文不好的我默默的留下了眼泪)。看来之后我要紧跟Go的版本发布了,不然过几个版本之后,现在的这些特性还不知道会做出怎样的修改,或者推出了什么更高级的特性,期待~~~
参考