go module迁移实践记录

贺大伟 · · 583 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

公司的代码库都在自建的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

来源:掘金

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:贺大伟

查看原文:go module迁移实践记录

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

583 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传