在学习golang的过程中遇到了“package xx is not in GOROOT”的报错,记录下解决问题的方法。
区分路径
Golang在安装时有两个非常重要的环境变量(路径):
- GOROOT:Golang的安装路径,安装默认设置
- GOPATH:Golang的项目目录,需手动指定
go_project // (go_project为 GOPATH目录)
– bin // golang编译可执行文件存放路径
– pkg // golang编译包时,生成的.a文件存放路径
– src // 源码路径。按照golang默认约定,go run,go install等命令的当前工作路径
报错分析
导包时编译器不检索GOPATH路径,导致包管理出现问题。
golang 1.11版本及以后的不在建议使用GOPATH,推荐使用go mod——GO111MODULE,go modules 是1.11版本的新加特性。
模块是相关Go包的集合。modules是源代码交换和版本控制的单元。 go命令直接支持使用modules,包括记录和解析对其他模块的依赖性。modules替换旧的基于GOPATH的方法来指定在给定构建中使用哪些源文件。
GO111MODULE
GO111MODULE 有三个值:off, on和auto;默认设置为空。
- GO111MODULE=off,go命令行将不会支持module功能,寻找依赖包的方式将会沿用旧版本那种通过vendor目录或者GOPATH模式来查找。
- GO111MODULE=on,go命令行会使用modules,而一点也不会去GOPATH目录下查找。依赖包的存放位置变更为$GOPATH/pkg,允许同一个package多个版本并存,且多个项目可以共享缓存的 module
- GO111MODULE=auto,默认值,go命令行将会根据当前目录来决定是否启用module功能。这种情况下可以分为两种情形:⑴当前目录在 GOPATH/src 之外且该目录包含go.mod文件;⑵当前文件在包含go.mod文件的目录下面。
解决方案
命令行使用go env查看环境,默认GO11MODULE是没有设定的。
方案一:go mod 模式设置为auto
go env -w GO111MODULE=auto
方案二:go mod 模式设置为on
go env -w GO111MODULE=on
// 并在项目目录下执行
go mod init
// 初始化包管理并产生以下两个文件
// go.mod
// go.sum
// 这两个文件注意不要删掉了,否则就会报错找不到包
Comments 1 条评论
博主 GrayZ
笔记+1