关于golang的mod一些使用技巧

关于本地库的引用

因为微服务存在多个公共库,而且都是私密库,所以导致go mod下载库时比较麻烦,容易被卡。其次还考虑到可能同时开发好几个微服务,重复获取git也不现实,所以弄成了公共库。这里遇到了一个问题,就是公共库如何被引用到go mod中。

  1. 在go.mod中的require设置好对应的库,以及版本。例如: gitee.com/abc/abc v1.0.0
  2. 之后外部设置一个replace替换路径,replace gitee.com/abc/abc => /本地公共库路径

go.mod设置如下

module gitee.com/微服务项目

go 1.13

require (
	gitee.com/abc/abc v1.0.0
    ...
)

replace gitee.com/abc/abc => /本地公共库路径

设置完成后,注意一定要使用go mod tidy整理,最后再使用go mod vendor自动完成下载。go mod会把这个公共库和本地代码做对比,克隆使用到的方法文件。

 

关于线上流水化设置

因为使用了多个私有库做引用,而且本地和远程自动流水设置上都有出入,所以线上在编译前一定要替换掉这个go.mod,这就需要在项目内写几个脚本和备用文件,用于替换。这里以这个项目为例说明。

1、流水线在克隆代码时,必须同时克隆公共库的git。以阿里的云效为例,输入源需除了拉取要编译的微服务外,还需要拉取公共库。

2、在项目内./scripts/dev下创建流水线专用的go.mod

module gitee.com/微服务项目

go 1.13

require (
	gitee.com/abc/abc v1.0.0
    ...
)

replace gitee.com/abc/abc => /流水线公共库git克隆路径

3、在流水化构建部分,编译前注意加上强制覆盖go.mod的方法。

# 镜像
export GOPROXY=https://goproxy.cn
# 编译之前,迁移frame底层框架
mv -f ./script/dev/_go.mod ./go.mod
# 构建
go build -o ./builds/a1_linux64 gitee.com/abc/a1
# 将相关配置文件更换到builds目录
...

4、设置好其他流水线方案设计,运行即可。