go module迁移实践记录

2,420 阅读2分钟

公司的代码库都在自建的gerrit服务器上,迁移期间主要踩的坑就是gerrit上的私有库如何module落地。

私有库如何通过go mod拉取

初次尝试时,在项目根目录下创建go.mod文件,内容如下:

module xxx.com/xxx/middleware

go 1.13

然后执行 go mod tidy 命令 此时会自动拉取项目依赖,此时可以看到go mod的拉取过程,期间发生了未识别引入包的报错 unrecognized import "path xxx.com/xxfeature" (https fetch: Get xxx.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的包名是什么,源地址是什么,具体的可以参考这篇文章 ,写的很详细,我就不再累述了。