目录
问题背景
解决方案
在线环境下
离线环境下
问题背景
mod模式的项目进行编译,报错第三方库下找不到go.mod文件。
解决方案
首先确认$GOPATH目录是什么,举例如/a/b,下边正常情况下有src、pkg、bin三个目录,其中前面两个目录必须。
mod模式的项目所下载的依赖会放到/a/b/pkg/mod下。
(编译任何mod项目时)
在线环境下
1,原有的go.mod文件的require内容可以copy出来,然后删除项目原有的go.mod和go.sum文件(重命名也可),
如果操作前缺失go.mod也没关系;
2,确认GO111MODULE开关是否开启,如果没有则需要开启:
go env -w GO111MODULE=on 或 export GO111MODULE="on"
如果提示:warning: go env -w GO111MODULE=... does not override conflicting OS environment variable
表明环境变量中已经设置过该变量,此时查看/etc/profile文件,文件尾肯定是之前设置过的环境变量,
如果是off则将
export GO111MODULE="off" 改为 export GO111MODULE="on"
3,项目目录下 go mod init,会产生一个空的go.mod文件
4,执行go mod tidy整理依赖,执行时也可携带当前编译的go版本,如:go mod tidy -go=1.16,此时会先finding
如果mod目录下有待下载的包,则会有found字样出来;如果没有则出现download字样进行下载;
5,进行编译:如果提示no required module provides package ... to add it: 则将前面copy的mod内容粘贴到go.mod文件中:
填充go.mod文件方式分为两种,linux下手动require添加进去,goland下会自动填充到mod文件;
补充go.mod文件后,继续go mod tidy
6,再次编译即可成功
离线环境下
离线环境下无法拉取依赖包,因此需要在正常可编译的环境下拉取好依赖,打包后传到离线环境下编译。
1,正常可编译的环境下进行编译,将mod目录打压缩包;(一定要确认打的包完整)
2,离线环境上,上传、解压到的$GOPATH/pkg/mod目录下,确认离线环境的GO111MODULE是开启状态;
3,编译即可。如果mod下的包都完整,则编译成功,结束。
否则会报如题的报错go.mod: no such file or directory,作者的报错就是这一步产生的。继续看第4步;
4,如果继续报该错,则必然是包不完整,此时按第一种“在线环境下”的方案去处理,删掉原有的go.mod重新编译、整理依赖、给mod目录打包
5,上传到离线环境重新编译即可成功。
作者两种情况均亲历亲为趟过了浑水,尤其离线环境时不要怕麻烦,第一次编译后打包传到离线环境结果编译没通过,
原因就是包不完整,第二次编译发现又下载了部分包,因此总结后希望大家遇到时都能尽快解决这个问题!



