说明
本文主要讲述如何将一个久远的go项目,使用go mod来进行管理。
我们的电商项目使用的是beego,这个项目是2017年建的,那时候golang刚刚处于兴起阶段,也没有比较好的包管理机制。所以这个项目发展到现在,结构是这样的
|
|—koala
|—src
|–i18n
|—vendor
|—lib
koala是系统组封装的一些基础库,如rpc,服务发现等功能都在koala里。i18n可以认为是action层,lib可以认为是model层。最初的设想是如果今后有新的服务,可以复用lib。那vendor是如何产生的呢?在这个结构里,大家可以看到koala是系统组维护的,放的是一些通用的功能,我们电商服务需要的一些包并不适合放到koala里,lib作为一个lib库,也不适合放,所以有同学在i18n里创建vendor,临时解决了电商项目自身需要引用的包的问题。
到目前为止,i18n引用了koala,vendor,lib,引用来源多样,同时升级部分包极其困难。另外随着gomod使用越来越广泛,使用gomod的同学来开发电商项目会有一些不适。所以需要将该项目进行改造。
环境
- MAC + go1.12
步骤
1.删掉vendor
2.GOPATH目录下不应该包含该项目,开启gomod: export GO111MODULE=auto
3.golang开启gomod模式,golang版本需要2019.3以上![image-20200421191301732](/Users/pangzhiqiang/Library/Application Support/typora-user-images/image-20200421191301732.png)
4.处理i18n
执行 go mod init mi-i18n,名字要和目录名一致
在i18n中全局替换 “mi-lib/ -> “micode.be.xiaomi.com/yinsongyang/mi-lib/
在i18n中全局替换”mi.com/ -> “micode.be.xiaomi.com/systech/
zip包有问题,版本太低了,进行修改
PS:
A为公司代码库域名,B或者C为组名
***.com是koala中的包,感谢系统组将koala中的包做了拆分,支持go mod,否则电商项目也很难使用go mod
代码太过于古老,有些包一直没升级,目前这些包的老版本已经不存在了,对于这部分功能,需要重写一下,点名archivex包
5.引入lib
在lib中执行go mod init micode.be.xiaomi.com/yinsongyang/mi-lib
在lib中全局替换 “mi-lib/ -> “micode.be.xiaomi.com/yinsongyang/mi-lib/
在lib中全局替换”mi.com/ -> “micode.be.xiaomi.com/systech/
i18n中的go.mod中添加 micode.be.xiaomi.com/yinsongyang/mi-lib v0.0.7,并利用replace走本地lib,replace micode.be.xiaomi.com/yinsongyang/mi-lib => ../../src/mi-lib
PS:
使用replace,并且使用相对路径有两个好处,一是开发的时候只要改动本地lib代码即可,无需提交lib后,生成新的tag,引用新的tag。尤其在lib会经常变更的情况下。二是在远程编译的时候,只要将lib放到适当的位置,go.mod无需做任何变动,也不需要关注go.mod里lib的版本,节省了开发成本
6.修改build.sh,编译项目
修改build.sh: 去掉gopath,下载lib到go.mod指定的位置
国内一些包可能下载不下来,最好设置一下GOPROXY
PS:
修改完后,项目编译成功,发布成功
go.mod中使用replace,也不会增加开发人员开发的成本
问题
在将gomod引入该项目的时候,碰到一些小问题,记录如下
1.更改gomod里某个包的版本,执行go build,该包版本恢复为原来的,需要查看是否其他包里引用了该包的更高版本。目前如果相同的包有多个版本,gomod会将所有包设置为最高版本
2.grpc使用版本v0.0.14,一直编译不通过,后面查找发现,其对应的google.golang.org/grpc需要为v1.19.0。所以编译不通过的时候,可以从这个方面入手查看原因