Go 1.14解决Go Modules模式下更新私有库问题
<p> 在Go 1.11之后推出了依赖包管理工具Go Modules之后,Go项目可以在 GOPATH 之外的位置创建,当项目中仅使用了公有库作为依赖时,使用 <span class="cnblogs_code">go get</span> 或 <span class="cnblogs_code">go mod</span> 更新依赖一切如初,没有任何问题。</p><p> 由于Go Modules默认使用代理去更新依赖,所以当使用了私有仓库作为依赖时,Go更新依赖的相关命令将不再可用。</p>
<p> </p>
<p>通过以下配置,可以实现更新支持https协议的私有库依赖。</p>
<p>1. 设置 GOPRIVATE 环境变量 <span class="cnblogs_code">go env -w GOPRIVATE=private.repo.com</span> </p>
<p>2. 修改git的全局配置</p>
<div class="cnblogs_code">
<pre>git config --global url.<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ssh://git@private.repo.com</span><span style="color: rgba(128, 0, 0, 1)">"</span>.insteadOf <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">https://private.repo.com</span><span style="color: rgba(128, 0, 0, 1)">"</span></pre>
</div>
<p>然而如果私有库不支持https协议,会报如下的错误。这是因为Go更新依赖时,会强制校验CA证书来确保依赖库的安全性。</p>
<div class="cnblogs_code">
<pre>go: private.repo.com/modules/project@v0.0.0-20200320063051-28c4ad7fe2ea: unrecognized import path <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">private.repo.com/modules/project</span><span style="color: rgba(128, 0, 0, 1)">"</span>: https fetch: Get <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">https://private.repo.com/modules/project?go-get=1</span><span style="color: rgba(128, 0, 0, 1)">"</span>: dial tcp 123.123.123:443: connect: connection refused</pre>
</div>
<p> </p>
<p>如果要更新不支持https协议的私有库,还需再做如下的配置。</p>
<p>1. 需要对git的全局配置做出调整,将https改为http。</p>
<div class="cnblogs_code">
<pre>git config --global url.<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ssh://git@private.repo.com</span><span style="color: rgba(128, 0, 0, 1)">"</span>.insteadOf <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">http://private.repo.com</span><span style="color: rgba(128, 0, 0, 1)">"</span></pre>
</div>
<p>2. 添加参数或环境变量。</p>
<p style="margin-left: 30px">1) 使用 <span class="cnblogs_code">go get -insecure</span> </p>
<p style="margin-left: 60px">这种方式不推荐,原因如下</p>
<p style="margin-left: 60px">1. 添加 <span class="cnblogs_code">-insecure</span> 参数即表示更新依赖时可以不去校验CA证书,但是这会带来一个问题:范围无法界定(overkill),所有与要更新依赖相关联的依赖,均不会去做校验,可能会意外更新到不安全的依赖。</p>
<p style="margin-left: 60px">2. <span class="cnblogs_code">-insecure</span> 仅支持 <span class="cnblogs_code">go get</span> 命令,不支持 <span class="cnblogs_code">go mod</span> 命令,因此使用 <span class="cnblogs_code">go mod</span> 命令时是无法更新不支持https协议的私有库的。</p>
<p style="margin-left: 30px">2) 添加 GOINSECURE 参数</p>
<p style="margin-left: 60px">推荐这种方式</p>
<p style="margin-left: 60px">在Go 1.14中增加了新的环境变量,用于指定哪些域名下的仓库不去校验CA证书。</p>
<p style="margin-left: 60px">使用方式同 GOPRIVATE 类似 <span class="cnblogs_code">go env -w GOINSECURE=private.repo.com</span> </p>
<p> </p>
<p>感受</p>
<p> 这两天在家折腾Go语言,搞得我很怀疑人生,网上的好多博客都是使用旧版本Go的,在新版本出了一些新特性之后,很多方式都改了。第一次感受到我在紧跟一个开源项目的脚步,还是这么火的一个语言。</p>
<p> Go现在给我的感觉就是,它还在一个紧锣密鼓的开发阶段,一些特性,一些功能,还没有那么完善。就拿Go Modules来说,它是Go 1.11才推出的一个功能,截止到1.14,还未支持所有的Go Tools,GOINSECURE也是1.14才提供的一个参数,未来如何发展还是未知数。</p>
<p> Go的开源社区还是相当活跃的,好多疑问都可以在里面找到解答,甚至是官方的解答(找不到中文的博客,只能Google去看Github和Stack Overflow,英文不好的我默默的留下了眼泪)。看来之后我要紧跟Go的版本发布了,不然过几个版本之后,现在的这些特性还不知道会做出怎样的修改,或者推出了什么更高级的特性,期待~~~</p>
<p> </p>
<p>参考</p>
<p style="margin-left: 30px">1. Go 1.14 Release Notes</p>
<p style="margin-left: 30px">2. Using Go Modules</p>
<p style="margin-left: 30px">3. add GOINSECURE for insecure dependencies</p>
<p style="margin-left: 30px">4. track tools/tooling updates to support modules</p><br><br>
来源:https://www.cnblogs.com/hiwz/p/12652153.html 楼主分享得太及时了!最近刚好被私有仓库的拉取问题折腾得够呛,Go Modules默认走代理确实是个大坑。GOPRIVATE这个环境变量真的救大命,顺便补充个小经验,其实它支持通配符写法,比如go env -w GOPRIVATE=*.yourcompany.com
,这样批量配置起来更省心。另外如果遇到校验失败的问题,记得把GONOSUMCHECK和GONOPROXY也一并配上,基本就能畅通无阻啦。感谢大佬指路,已经收藏备用,祝楼主项目顺利,天天好心情!
頁:
[1]