公司的代码库都在自建的gerrit服务器上,迁移期间主要踩的坑就是gerrit上的私有库如何module落地。
私有库如何通过go mod拉取
初次尝试时,在项目根目录下创建go.mod文件,内容如下:
module xxx.com/xxx/middlewarego 1.13复制代码
然后执行go mod tidy命令 此时会自动拉取项目依赖,此时可以看到go mod的拉取过程,期间发生了未识别引入包的报错unrecognized import "path xxx.com/xxfeature" (https fetch: Getxxx.com/xxfeature?g…dial tcp 192.168.67.1:443: connect: connection refused)go mod 不行,那咱先用go get试试是否可以拉取,因为go mod底层其实跟go get 的实现类似
执行go get -v xxx.com/xxfeature尝试之后还是一样的问题,后来查看了下go get命令的源码,原来需要在包目录的末尾加.git后缀。
加了后缀在此执行go get -v xxx.com/xxfeature.git嗯,可以了,需要auth认证,这肯定是不行的,线上的机器谁去输入username,passwd啊,而且使用脚本自动输入也不是个好主意,不够安全,这条路行不通,考虑使用ssh通过public key访问私有库,github.com的实现方式
Use ssh instead of https://git config --global url."git@github.com:".insteadOf"https://github.com/"复制代码
参考之,几经尝试,得到gerrit的实现方式
git config --global url."ssh://username@gerrit.xxx.com:port/".insteadOf"http://gerrit.xxx.com/"复制代码
哦,这里还要补充一个问题,go get默认使用https,而我们公司gerrit服务没有升级https,所以在使用go get的时候需要加参数 -insecure 来使用http
至此,私有代码库的代码已经可以通过 go get很愉快的拉取了,但是我还有一个坑要填,使用go mod的时候是没有办法使用类似-insecure的flag参数的,还是使用https来拉取代码库,这里暂时没有好的解决方法,也有很多同学遇到了相同的问题,给go官方提了issue,经过激烈的讨论,最终的理想方案是 在cmd/go: add GOINSECURE for insecure dependencies有兴趣的同学可以看下issue
私有库作为包引入时的包名问题
我们的项目中的私有库引入包名和库名是不同的,而引入的时候包名都是按照拉取的私有库代码目录来的。举个例子,代码库的路径为 gerrit.xxx.com/xxfeature,而项目中import的包名却是 xxx.com/xxfeature,这就很苦恼了,好在经过几经google,终于找到一份解决方案,修改go-import,其原理就是在go get的时候,先请求到代理服务器,然后代理服务器告诉go get import的包名是什么,源地址是什么,具体的可以参考这篇文章,写的很详细,我就不再累述了。
作者:迷茫追风
链接:https://juejin.im/post/6844903975859257352
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
有疑问加站长微信联系(非本文作者)