说明
本文主要讲述如何将一个久远的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
3.处理i18n
-执行 go mod init i18n,名字要和目录名一致
-在i18n中全局替换 “lib/ -> “A/B/lib/
-在i18n中全局替换”***.com/ -> “A/C/
-zip包有问题,版本太低了,进行修改
PS:
-A为公司代码库域名,B或者C为组名
-***.com是koala中的包,感谢系统组将koala中的包做了拆分,支持go mod,否则电商项目也很难使用go mod
-代码太过于古老,有些包一直没升级,目前这些包的老版本已经不存在了,对于这部分功能,需要重写一下,点名archivex包
4.引入lib
-在lib中执行go mod init A/B/lib
-在lib中全局替换 “lib/ -> “A/B/lib/
-在lib中全局替换”***.com/ -> “A/C/
-i18n中的go.mod中添加 A/B/lib v0.0.4,并利用replace走本地lib,replace A/B/lib => ../../src/lib
PS:
-使用replace,并且使用相对路径有两个好处,一是开发的时候只要改动本地lib代码即可,无需提交lib后,生成新的tag,引用新的tag。尤其在lib会经常变更的情况下。二是在远程编译的时候,只要将lib放到适当的位置,go.mod无需做任何变动,也不需要关注go.mod里lib的版本,节省了开发成本
5.修改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。所以编译不通过的时候,可以从这个方面入手查看原因
参考资料
1.https://studygolang.com/articles/21265
2.https://www.jianshu.com/p/0cebc1b035b5 import路径问题处理
3.https://www.jianshu.com/p/6f58f050ceda https://www.cnblogs.com/congccy/p/10762257.html goland安装go mod