Go语言官方的依赖包管理工具Go Modules已经发布很久,从1.14版本开始更是默认自动开启了Go Modules的支持,相信很多人公司里的项目都从go vendor、dep 之类的依赖管理切换到Go Modules上了吧。
Go Modules 号称是语言原生的、零配置开箱即用的包依赖管理工具,当然零配置只有我们项目依赖的都是相互之间没有冲突的外部公共包时这个条件才能成立。
我在之前的文章《项目改用GoModules管理依赖的方法和经验总结》里给大家总结了项目切换到Go Modules进行包依赖管理的一些步骤,也介绍了怎么用 replace 指令解决 etcd 和 grpc 的版本不兼容这个比较令人费解的问题的方法。
不过我发现一些朋友在第一次切换到Go Modules的时候在怎么让Go Modules使用私有代码仓库的包作为依赖模块时都会遇到些问题。这篇文章帮大家总结一下让Go Modules使用私有代码仓库做模块时,两个需要配置的地方。
配置Git使用SSH拉取私有依赖
如果不做任何设置,当我们的项目通过Go Modules 引用私有仓库的代码包时会发生以下错误:
go: downloading code.lazycorp.com/privaterepo v0.0.0-20200408100711-ed766a2975ce
go get code.lazycorp.com/privaterepo: code.lazycorp.com/privaterepo@v0.0.0-20200408100711-ed766a2975ce: verifying module: code.lazycorp.com/privaterepo@v0.0.0-20200408100711-ed766a2975ce: reading https://sum.golang.org/lookup/code.lazycorp.com/privaterepo@v0.0.0-20200408100711-ed766a2975ce: 410 Gone
server response:
not found: code.lazycorp.com/privaterepo@v0.0.0-20200408100711-ed766a2975ab: invalid version: git fetch -f origin refs/heads/*:refs/heads/* refs/tags/*:refs/tags/* in /tmp/gopath/pkg/mod/cache/vcs/13e63a509893edc19353a80fa2c6e28db213d146f72fe43ba65c1ec86624027b: exit status 128:
fatal: could not read Username for 'https://code.lazycorp.com': terminal prompts disabled
导致这个问题的原因是Go Moduels 默认通过 HTTPs 的方式下载 git 仓库上的代码,我们希望(而不是使用 HTTPS)通过 SSH 下载这些私有依赖,这样我们就可以使用本地设置的 SSH 密钥来访问git 仓库。
为解决这个问题我们可以做的是配置 git 将所有 HTTPs URL 重写为等效的 git SSH URL:
git config --add --global url."git@code.lazycorp.com:".insteadOf https://code.lazycorp.com
code.lazycorp.com
是我随便起的名字,这里应该替换成你们公司的git仓库的域名,如果是使用GitHub上的私有仓库就配置:
git config --add --global url."git@github.com:".insteadOf https://github.com
配置GOPRIVATE环境变量
这个环境变量就是为私有依赖准备的,一般是设置成代码仓库站点的域名。还是假如公司内部代码仓库站点的域名是code.lazycorp.com
,那么我们就把这个环境变量设置成
export GOPRIVATE=code.lazycorp.com
这样设置的话,所有路径前缀为code.lazycorp.com
的模块都不会再经过GOPROXY
指定的镜像站点拉取模块对应的软件包,转而去code.lazycorp.com
拉取软件包。
这里提一个小技巧,假如你自己开发的时候不想污染电脑系统里的全局环境变量,可以选择在GoLand
里开启Go Modules支持和设置环境变量,这样在GoLand
内编译运行程序时也能正常使用Go Modules。
![](https://i-blog.csdnimg.cn/blog_migrate/fa00cd8f330492976e71c10a1c0716d9.png)
总结
经过上面两步配置就能顺利让Go Modules使用上私有依赖了。