运维系列&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地址 

就能解决这个问题

多数是网络问题,也可换环境编译。







ProblemTerminator

cannot find package “xxx“ in any of的通用解决方案

posted @ 2024-05-25 16:36  坦笑&&life  阅读(26)  评论(0编辑  收藏  举报  来源