记一次go module的坑

一、背景

事情是这样的,因为小马本次要写一个go项目。但是因为一些权限问题,一些依赖包在内网小马获取不到,于是只能求助大大。大大给的策略就是他先把所有的依赖包go mod,然后go mod vendor迁移到项目目录vendor下进行本地依赖载入即可,也就是使用 go build -mod=vendor来编译即可。一切似乎看起来还是那么完美。然后正要起飞,直接翻车,现场如下。【这里插播一条发现,就是使用golang IDE go build 和使用命令行go build 的区别在于前者不会生成.exe文件】

二、翻车现场

将大大go mod vendor完的包pull到本地,只要编译就会发生如下错误(以下省略了一部分类似的报错)。其实是 go.mod内的所有依赖包都报错。

dD:\Go\bin\go.exe build -o C:\Users\lihi\AppData\Local\Temp\___go_build_main_go.exe D:\gok\word\main.go #gosetup

go: inconsistent vendoring in D:\gok\word:

git.code.oa.com/components/l5@v0.3.0: is explicitly required in go.mod, but not marked as explicit in vendor/modules.txt

github.com/golang/protobuf@v1.4.3: is explicitly required in go.mod, but not marked as explicit in vendor/modules.txt

golang.org/x/net@v0.0.0-20201216054612-986b41b23924: is explicitly required in go.mod, but not marked as explicit in vendor/modules.txt

run 'go mod vendor' to sync, or use -mod=mod or -mod=readonly to ignore the vendor directory

Compilation finished with exit code 1

三、现场勘察

大大说他的本地编译是正常的。不得不怀疑是不是因为大大本地gopath还有一份包依赖的原因,然而经查并不是这个问题。翻阅了网络上的大部分资料无果,网络上要么是说是因为识别不到包,按照提示重新go mod vendor一下就可以了。小马蛮试了一下,不出所料必然地报远程报获取不到呢,IDE的报错定位其实是不准确的。再次检查vendor/modules.txt文件,没有问题,无果。 于是开始质疑golang IDE 的版本支持问题,无果。看了下go.mod文件中写着go 1.14,也没错呢,小马用的GO SDK正是1.14.4版本。敲出go env 查看环境配置,GO111MODULE=on,因为环境变量是auto,但是go到一定版本后默认是on,也没问题,无果。那问题出在哪呢?由于没有依赖包拉取权限,只能再次求助大大,大大表示也很奇怪,一番折腾,于是问题得到解决。【这里插播一条好玩的东西,就是GO111MODULE为什么是GO111呢,因为其实1.11版本开始支持MODULE的】

四、问题解决

结论是:因为大大go  mod的时候用的是go 1.13,而我编译的时候用的 1.14,所以就报了这个奇怪的错误。you what?直接懵逼。但是为啥go.mod文件中写的版本要求是1.14,而大大用1.13也编译得好好的。

这是个大坑,掉进坑里自己扑腾了一天!!希望大家谨慎入坑。

五、小本本

爬坑一小时出坑一秒钟,每一次的爬坑都是充满着十八般绝技。奇怪的姿势又增加了。

go运行方式有哪几种?

gopath模式, 配置gopath目录,一般目录下有三个目录:bin,pkg,src。项目代码放在src中。先在gopath的vendor中寻找依赖包。

go mod模式, 是先在项目目录的vendor下寻找依赖包,然后在gopath的pkg/mod下寻找依赖包。如果都没有则远程下载到默认gopath的pkg/mod下,该模式不认src目录。也可以强制用go build -mod=vendor 或者-mod=mod来决定是否直接使用本地的vendor依赖包直接运行编译,忽略go mod中的依赖,不识别远程依赖包(这一点非常适合包的随意拷贝分发,当然也是本次没有依赖包权限的解决方法)。

如果GO111MODULE是auto则根据项目目录位置和是否含有go.mod文件来决定使用什么模式。如果是GO111MODULE=off则使用gopath,如果是on则使用module模式。gopath模式下的src目录下不能有go.mod文件,否则报错。

一些go mod命令记录备用,国内的资料并不多(注意go mod 命令在 $GOPATH 里默认是执行不了的,因为 GO111MODULE 的默认值是 auto。默认在$GOPATH 里是不会执行, 如果一定要强制执行,就设置环境变量为 on。):

查看环境设置:go env

查看go版本:go version

设置顶级vendor作为依赖:go env -w GOFLAGS="-mod=vendor"  查看env 是GOFLAGS=-mod=vendor,取消:g o env -w GOFLAGS="-mod=";

指定gomod编译 模式:go build -mod=vendor

go mod download下载模块到本地缓存,缓存路径是$GOPATH/pkg/mod/cache

go mod edit是提供了命令版编辑go.mod的功能,例如go mod edit -fmt go.mod会格式化go.mod

go mod graph把模块之间的依赖图显示出来

go mod init初始化模块(例如把原本dep管理的依赖关系转换过来)

go mod tidy增加缺失的包,移除没用的包

go mod vendor把依赖拷贝到vendor/目录下

go mod verify确认依赖关系

go mod why解释为什么需要包和模块

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

推荐阅读更多精彩内容

  • Go Module是Go用来进行模块(模块是Go里面最小的源代码依赖管理单元)依赖管理,对所有引入的模块标记版本号...
    taj3991阅读 1,073评论 0 1
  • 原文链接 https://golang.org/cmd/go/由于内容过长,分两次发布 Go 是一个用来管理Go源...
    Cxb168阅读 1,255评论 0 0
  • Go 1.11 Modules翻译自 Go 官方wiki # Go 1.11 Modules 根据[提议](htt...
    drawing818阅读 1,441评论 0 0
  • File types(文件类型) go命令检查目录中特定文件的集合。它根据文件的扩展名表示要检查的文件。这些扩展名...
    Cxb168阅读 1,744评论 0 0
  • https://www.cnblogs.com/chnmig/p/11806609.html[https://ww...
    千沙qiansha阅读 205评论 0 0