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的版本发布了,不然过几个版本之后,现在的这些特性还不知道会做出怎样的修改,或者推出了什么更高级的特性,期待~~~

 

参考

1. Go 1.14 Release Notes

2. Using Go Modules

3. add GOINSECURE for insecure dependencies

4. track tools/tooling updates to support modules

posted @ 2020-04-07 15:10  风吹落花飘然成雨  阅读(9592)  评论(0编辑  收藏  举报