一 项目背景 目前的golang私有库依赖,可以放在git repo中,需要特别在go.mod中写replace条目,解决多重依赖很麻烦,git 的repo有可能比较大,使用该方案能够支持版本的统一管理(公共依赖和私有依赖都通过go get 获取)。
二 整体流程 前言: 因为私有仓库不能直接go get, 所以需要自己开发一个<代理服务>,参https://segmentfault.com/a/1190000018398763的三篇帖子。
- 启动<代理服务>,启动的详细配置见附录https证书相关配置。普通的外部依赖包我们希望通过https://goproxy.cn去拉取,
的包则希望通过http:// : /pkg/pkg2拉取。但是公司内部的包都是以 “ ”开头,所以需要配置/etc/hosts文件,将g 指向真实的仓库地址。此外还需要配置环境变量GONOPROXY= (详见附录GO(v>=v1.13)环境变量设置),配置好之后只要是 的包都会向<代理服务>发送https请求(具体原理请参考附录go get原理)。
2. <代理服务>响应html页面,页面包含了真实的仓库地址http://
3. 获得真实的git仓库地址后,go get通过向git仓库发送git ls-remote请求获取仓库可用版本列表。通过git clone下载对应的源码。如果此时的git仓库不是公共仓库,下载会有权限问题,此时可以更改git的全局配置解决(详见附录git 的配置)。
4. 返回对应的源码的$GOPATH/pkg/mod 里面。
5. 需要拉取外部的依赖。
直接通过https://goproxy.cn获取对应的源码并且下载到$GOPATH/pkg/mod 里面。
备注:目前国内的goproxy代理主要有https://goproxy.io 和https://goproxy.cn两者都是由中国人开发,https://goproxy.cn的延时是https://goproxy.io的一半。
三 集成配置方案 centos7:
1.配置环境变量
GOPROXY = http://ip:port
GONOPROXY=
2.配置 /etc/hosts
ip
该ip指的是<代理服务>运行的地址
3.配置https证书
不同操作系统的配置方式不同,详见第四节(各种操作系统开发环境配置)
cat .../ca.crt >> /etc/pki/tls/certs/ca-bundle.crt 更新证书。
- Git的配置
四 各种操作系统开发环境配置 Centos7
1.配置host文件
cat /etc/hosts
ip
- 配置环境变量:
- 更新证书:
验证配置:curl https://
- git全局配置:
验证配置:去
如果执行 git ls-remote -q http://
Ubuntu
1.配置host文件
cat /etc/hosts
ip
2.配置环境变量:
详见附录
3.更新证书:
cp
update-ca-certificates
验证配置:curl https://
4.git全局配置:
git config --global url."ssh://
验证配置:去
如果执行 git ls-remote -q http://
Macos
- 配置host文件
ip
2.配置环境变量:
详见附录
- 更新证书
验证配置:curl https://
4.git全局配置:
git config --global url."ssh://
验证配置:去
如果执行 git ls-remote -q http://
Windows
- 配置host文件
ip
- 配置环境变量:
- 更新证书
下载
双击打开,安装证书
验证配置:curl https://
4.git全局配置:git config --global url."ssh://
验证配置:去
如果执行 git ls-remote -q http://
日常使用手册
- 在.go文件中import需要依赖的包
- go build/ go mod tidy/go test 会自动添加需要的依赖
- 常用命令
cmd |
decs |
go list -m all |
列出依赖和版本详情 |
go list -u -m all |
查看可升级的依赖包 |
go get -u or go get -u=patch |
更新依赖包 |
go mod vendor |
继续使用verndor模式,依赖直接下载到工程的vendor目录 |
F&Q 如果开源的包没有规范的版本号,如何指定依赖?
有些包没有按照go module的规范打tag, 导致无法直接编辑go.mod,如果自动拉取会自动拉取最新依赖,和代码实际依赖的版本可能冲突。此时可以通过commit号来解决。
例如某个工程依赖:了k8s.io/api 分支release1.12,tag为kubernates-v1.10 。此时需要去github上找到对应的commit-id, 通过go get k8s.io/api@
如果依赖的包是git仓库的子集目录,能够自动获取吗?
可以,目前公司开发的<代理服务>支持直接获取依赖。
或者直接用go get命令下载对应的代码到本地,例如我们自己的私有依赖包:
,但是flaghelper是
https://g
附录 https证书相关配置
- 生成服务端的根证书:
openssl req -new -x509 -days 36500
-sha512 -subj "/O=
- 生成服务端证书的私钥和签名请求
openssl req -new -subj "/O=
- 准备生成服务端证书的配置(其中
是预期服务被访问的域名)
cat >> openssl.cnf << EOF
[ SAN ]
basicConstraints = CA:FALSE
extendedKeyUsage = serverAuth, clientAuth
keyUsage = digitalSignature, keyEncipherment
subjectAltName = IP:xxx.xxx.xxx.xxx,IP:127.0.0.1,DNS:
EOF
4、生成服务端证书
openssl x509 -req -extfile openssl.cnf -extensions SAN -days 36500 -sha512-CAcreateserial -CA ca.crt-CAkey ca.key -in server.csr -out server.crt
5、更新机器认证信息
cat .../ca.crt >> /etc/pki/tls/certs/ca-bundle.crt
经过该配置后,访问https的服务就不会出现不信任证书的错误。
eg: curl https://
Go get 原理 使用go get 取包时:go get
会先默认发送一个https请求:https://
该请求响应为:
通过响应的内容,确定git仓库地址。因为我们的git仓库并不会自动产生该响应,所以需要一个中间件来代理此服务。
Git 的配置 1.配置私有ssh访问方式
cat~/.gitconfig
[user]
name = xxx
【Go-proxy私有仓库配置实践】email = xxx
[url "ssh://admin@192.168.60.7:29418"]
insteadof =
或者使用命令:
git config --global url."ssh://admin@192.168.60.7:29418".insteadof "
GO (V >= V1.13)环境变量设置 export GOPROXY=https://goproxy.cn#公共包的代理
export GOSUMDB=sum.golang.google.cn#公共包版本校验地址,如果设置off可不校验包
export GO111MODULE=on
export GONOPROXY=
export GONOSUMDB=
Go modules 官方文档 https://github.com/golang/go/wiki/Modules
推荐阅读
- 【golang】leetcode中级-字母异位词分组&无重复字符的最长子串
- 彻底理解Golang Map
- kratos线上开源年会它来啦~
- 深入浅出 Golang 资源嵌入方案(go-bindata篇)
- 深入浅出 Golang 资源嵌入方案(前篇)
- golang 经典案例总结
- Go实战 | 基于有向无环图的并发执行流的实现
- Golang 数组和切片
- Go JSON编码与解码()
- golang map基础知识