Tony Bai · Go 语言第一课
Tony Bai
资深架构师,tonybai.com 博主
21492 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 59 讲
开篇词 (1讲)
结束语 (1讲)
Tony Bai · Go 语言第一课
15
15
1.0x
00:00/00:00
登录|注册

加餐|作为Go Module的作者,你应该知道的几件事

如何识别和处理
不推荐使用
通过子目录实现major版本号升级
适合单module
自然过渡
注意内部包间导入路径
修改go.mod文件
建立major分支
提示整个大版本作废
标记作废的版本
例:v1.0.3
不适用于GoProxy缓存
避免发布broken状态的module
公测版本发布
tag需包含module目录名
tag即module版本
版本管理复杂
例子:github.com/bigwhite/srmm
需要谨慎和深思熟虑
一个仓库管理多个module
例子:github.com/bigwhite/srsm
简单易懂,心智负担低
一个仓库管理一个module
单repo多module布局需特别注意
发布和维护需谨慎
支持多种布局方式
Go Module成熟
不兼容的change
子目录方案
major分支方案
升级操作
major版本号作为导入路径一部分
语义导入版本机制
使用Deprecated注释
使用retract指示符
发布新的patch版本
修复broken版本并重新发布
发布错误版本的影响
注意事项
单repo多module
单repo单module
打tag推送到代码服务器
多module
单module
小结
思考题
升级module的major版本号
作废特定版本的Go Module
发布Go Module
仓库布局
Go Module 作者指南

该思维导图由 AI 生成,仅供参考

你好,我是 Tony Bai。
我们的专栏在 06 和 07 讲对 Go Module 构建模式的原理,以及如何使用 Go Module 构建模式做了详细的讲解,在课后留言中,我看到很多同学直呼过瘾,表示终于搞清楚 Go Module 构建模式了。
不过,之前的讲解更多是从 Go Module 的使用者角度出发的。在这篇加餐中,我们再从 Go Module 的作者或维护者的视角,来聊聊在规划、发布和维护 Go Module 时需要考虑和注意什么事情,包括 go 项目仓库布局、Go Module 的发布、升级 module 主版本号、作废特定版本的 module,等等。
我们先来看看作为 Go Module 作者在规划 module 时遇到的第一个问题:一个代码仓库(repo)管理一个 module,还是一个仓库管理多个 module?

仓库布局:是单 module 还是多 module

如果没有单一仓库(monorepo)的强约束,那么在默认情况下,你选择一个仓库管理一个 module 是不会错的,这是管理 Go Module 的最简单的方式,也是最常用的标准方式。这种方式下,module 维护者维护起来会很方便,module 的使用者在引用 module 下面的包时,也可以很容易地确定包的导入路径。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Go Module的作者在规划、发布和维护时需要考虑仓库布局、版本发布和处理broken状态的module等问题。单一仓库管理一个module是最简单的方式,而单仓库多module模式需要更谨慎和深思熟虑。发布Go Module时,需要为repo打上tag并推送到代码服务器,注意在tag中加上各个module的子目录名。作者需要注意避免发布处于broken状态的module版本,以及作废特定版本的Go Module。修复broken版本并重新发布可能无效,因为Goproxy服务器会缓存已发布的broken版本。解决这个问题的更常见方式是发布module的新patch版本,或者升级module的major版本号。从Go 1.16版本开始,Go Module作者还可以在go.mod中使用retract标识作废的版本,以及使用Deprecated注释行提示作废的module版本。升级major版本号时,作者需要建立新的major分支并修改go.mod文件中的module path。消费者在依赖module进行major版本号升级后,只需要在import路径的后面增加/vN,并对不兼容的部分进行修改。在实际操作中,也有一些Go Module的仓库,始终将master或main分支作为最高major版本的分支,然后建立低版本分支来维护低major版本的module代码。在单repo多module管理方式下,升级module的major版本号有些复杂,需要分为两种情况来考虑。在这些情况下,需要建立major分支矩阵来维护不同module的版本。总的来说,Go Module经过多年打磨已经逐渐成熟,对各种Go Module仓库的布局方式都提供了很好的支持。无论是发布module打版本号还是升级major版本号,Go Module都提供了相应的解决方案。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Tony Bai · Go 语言第一课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(4)

  • 最新
  • 精选
  • bearlu
    老师,你好。有没有构建module的项目过程的资料?比如我新建一个项目,想发布出去,整个流程是如何?

    作者回复: 文章里没有将这个过程整理成流程图。但是结合这篇加餐以及专栏中讲解go module的章节,可以自己整理一下。整理过程中,如遇到具体问题,可以留言。

    2022-02-08
    3
    1
  • 黄常凯
    在代码里import的包,是怎么找到github上的呢?是goproxy的作用吗

    作者回复: import后面的导入路径就是go module所在路径啊。 比如:import "github.com/xxxx/yyyy", go就可以直接去github.com/xxxx/yyyy去下载的啊。当然有了goproxy的存在,如果goproxy上已经cache了所需要的版本,那么就可以直接从goproxy上获取到。如果没有,那么goproxy也是会根据go module的路径直接去github上找到。 当然github.com只是go module托管较多的代码站点,你还可以用gitlab、bitbucket等,道理是一样的。

    2022-05-27
  • 谢小路
    一个隐性规则,tag 永远递增(不会删除,更不会递减),就能避免很多问题。

    作者回复: 👍

    2022-04-25
  • 有个疑问: 发布版本的时候是 V2.0.0 , 安装的时候 是不是直接找 v2.0.0 这个 tag就可以了? 和 go.mod 指定的版本是没有关系? go.mod 指定的版本 只是依赖模块内部进行区分的

    作者回复: 问题中的“安装”是指哪个环节?go install么?

    2022-02-14
    2
收起评论
显示
设置
留言
4
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部