运维系列&go系列:cannot find package “xxx“ in any of的通用解决方案
cannot find package “xxx“ in any of的通用解决方案
目录
这个问题遇到频率还是比较高,这次总结出来,希望能让更多的人脱离苦海!
如有帮助,欢迎留下足迹哦!
问题背景
作者的问题:提示找不到的是工程内部自定义的包名
今天出了个奇怪的事情,编译项目提示cannot find package "包名" in any of 其中提示找不到的包名是工程内已有的。
接连提示了好几行类似的信息。
我在本地开发时goland中使用插件与指定远程Linux机器进行了同步,目的即本地修改了的可以同步到Linux机器上,并在Linux下进行编译及其它操作。
经过仔细思考整个过程,终于发现了引起的原因:同步到远程Linux时目录是自己在/root下新建的目录,该目录并不在$GOPATH下:
看看$GOPATH的路径:
解决
把本地和远程同步的目录直接修改成$GOPATH下,即放好之后的新地址:/root/go/src/工程名 这样就OK了。
上面的问题是作者遇到的,作者的项目是一个非mod模式下的项目,原因就在于$GOPATH,当然各位看官的问题背景可能不一样,但原因基本相同。
通用解决方案
也就是说,项目非go mod模式时,项目需要放在$GOPATH目录下编译;
如果使用了module模式,则没有这个要求,但GO111MODULE开关必须打开。
这是通用规则。那如何确认当前项目是否是mod模式?
1,查看该项目目录是否有go.mod和go.sum 文件,如果有则该项目使用的是mod模式,此时需要将GO111MODULE开关打开;
2,如果项目中没有go.mod和go.sum 文件,则需要将GO111MODULE开关关闭;
即模式要适配后再编译。
如何查看当前环境是否开启了GO111MODULE:
go env
查看GO111MODULE,结果为on则开启,off为关闭,auto为自动。
情况1
如果是mod项目, 模式关闭时分别去$GOROOT,$GOPATH目录下找包,如果以前没下载过 包到$GOPATH。
因此在GO111MODULE关闭的情况下编译会报这个错,此时需要将GO111MODULE打开:
set GO111MODULE=on
或
go env -w GO111MODULE=on
再次编译即可。
情况2
GO111MODULE开关匹配的情况下,提示找不到啥,就拉它的代码($GOPATH模式下一般需要go get,mod模式下编译时自动拉取/查询)。
可以先配置go代理:
export GOPROXY=https://goproxy.cn,direct
或
go env -w GOPROXY=https://goproxy.cn,direct
然后重试,80%此时已成功。
如果依旧不行,继续走下面的:
执行 go get -u 库地址
或手动进行:
cd $GOPATH/src/xxx
执行 git clone 该库git地址
就能解决这个问题
多数是网络问题,也可换环境编译。