Go Module 实践中的问题

原文地址:https://romatic.net/post/gomod/

项目逐渐都切到了 go mod,用的时候遇到了各种奇奇怪怪的坑,记录一下。

流程实践

语义化版本

Go mod 在设计时没有支持诸如 >2.0, ~3.4, ^4.0 这样场景的语法。而是以语义化版本的约定来处理:

x.y.z^x.y + <=y.z

实际中,对于内部频繁升级的 common 包,每次改动都需要 y+=1 才能保证兼容性。为此我专门搞了个小玩意来升级 y,可以通过 hook 在 push 前先 gt ft

有个比较恶心的问题,common 包的版本号长期维持在 1.y.0 且 y 很大。暂时没用解决的办法,后面再看看 x 能有什么新玩法。

不同分支依赖冲突

如图,一个常见的场景,多人开发项目时,有可能在开发过程中使用了不同的依赖包,在合并代码的时候也会冲突。

image

以前的办法是有个专门的 vendor 分支,把有关依赖的变动串行化。

但是用了 gomod 后,如果你只在 vendor 分支 里加了依赖没有用,go mod tidy 时又会把依赖给去掉。

异常问题处理

go replace 替换大小写时不支持同时依赖大小写

P->A
P->xx->a

天真以为把 A replace a 就好了。还是会报同时用了大小写的错。

只有当所有依赖都依赖 A,但是 github 已经改成 a 时,才能 replace。

问题最初是由于 github.com/sirupsen/logrus 更换大小写引起,如果项目全用 Sirupsen 是可以 replace 的,后来有了混用就不行了。终极解决办法是干掉 logrus 。。

凡是随意修改包路径、函数签名的 Go Libs,基本上都被我列入黑名单了。

build xx: ambiguous import: xx in multiple modules:

通常是在没有使用语义化版本时,对一个包有不同版本的依赖导致。例如:

build xxx.com/com/projA: cannot load xxx.com/com/projB/model: ambiguous import: found xxx.com/com/projB/model in multiple modules:
    xxx.com/com/projB v0.0.0-20181119101949-92ae1f75b49a (.../pkg/mod/xxx.com/com/projB@v0.0.0-20181119101949-92ae1f75b49a/model)
    xxx.com/com/projB/model v0.0.0-20190311082816-bfb94e79a84f (.../pkg/mod/xxx.com/com/projB/model@v0.0.0-20190311082816-bfb94e79a84f)

可以通过下面方式来找

fd go.mod | xargs grep -r projB
vendor/xxx.com/com/base/go.mod: xxx.com/com/projB/registry v0.0.0-20190312132550-a101ae8810b6 // indirect
vendor/xxx.com/com/artemis/go.mod:  xxx.com/com/projB/app/goprojB v0.0.0-20190312132550-a101ae8810b6
vendor/xxx.com/com/projB/registry/go.mod:module xxx.com/com/projB/registry

go replace 不能替换依赖包的依赖

我的项目P -> A&B,且 B->A

如果把 A replace 成 A‘,只能修改 P->A 的依赖, B->A 是改不了的。

所以 replace 不能解决梯子的问题,要用 goproxy

go get: error loading module requirements

go clean -modcache

清理 modcache 几乎是各种问题的终极大杀器,但是成本也很高,需要你下次重拉所有 mod。如果公司内有 proxy 做 cache 的话会好一些。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容