• 主页
  • 架构
  • 编程语言
  • 数据存储
  • 网络
  • VMware
  • 服务器
  • 组网
  • AI
  • 算法系列
  • 设计模式
  • 读书笔记
  • 思考
  • 工具
  • 其它技术

  • 主页
  • 架构
  • 编程语言
  • 数据存储
  • 网络
  • VMware
  • 服务器
  • 组网
  • AI
  • 算法系列
  • 设计模式
  • 读书笔记
  • 思考
  • 工具
  • 其它技术

如何在旧项目中使用gomod

2024-08-15

说明

本文主要讲述如何将一个久远的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的同学来开发电商项目会有一些不适。所以需要将该项目进行改造。

环境

  1. 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。所以编译不通过的时候,可以从这个方面入手查看原因

参考资料

  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

扫一扫,分享到微信

微信分享二维码
论语
Go-callvis
© 2025 John Doe
Hexo Theme Yilia by Litten