背景介绍
这个go build的错误困扰了我很长时间,可能最大原因还是一个小白,在折腾了大半天加一晚上,度娘上各种找原因,也没有找到合适的解决办法,最终还是在大佬的指导下成功解决,所以记录一下。
配置环境介绍
- 目的:在idea下go build Go项目为二进制文件,然后将其放到服务器上运行
- window下已成功配置Go编译所需的环境变量,配置信息如下图所示
- IDEA中已成功配置Go环境,已下载Go插件,且GROOT、GOPATH、GOPROXY配置正确,如下图所示
- 设置go env -w GO111MODULE=on,及go mod为开启模式
- 在IDEA命令行进行go build前设置了相关的变量,具体为在要编译的项目内执行SET CGO_ENABLED=0,SET GOOS=linux,SET GOARCH=amd64(注意此处SET必须为大写否则不生效)
- 在上述步骤设置完成后,在IDEA命令行cd 进入到要编译的项目所在目录,执行go build 项目名/文件名.go,或者在所要编译的项目的上级目录执行go build 项目名,都无法成功,会出现类似的报错
总之,一句话就是go build的时候总会提示无法在GOROOT的src目录下加载不到要编译的包
问题原因及解决办法
我们都知道GO管理包的方式有两种,传统的GOPATH模式和目前流行的GOMOD,主要是我一开始对这两种方式不是很了解,只知道自己要编译的项目是在go mod下形式下编译的,也不知道深层次的原因是什么,网上有很多关于两者的区别和详细的介绍,本文在此不做赘述。
由于我的项目是放置于GOPATH的src目录下,所以在编译时还会默认是以GOPATH的方式来管理包,所以会报错,这时只需要将要编译的项目放置到非GOPATH的路径下即可编译成功,即在我的环境中不要放置在E:/GoProjects路径下。
编译过程如下:
- 进入要编译的项目的目录下,假设要编译的目录为E:/myProjects/test,要编译test目录,其中test目录下有三个.go文件,执行以下命令进入编译目录
cd e:/myProjects/test
- 然后设置编译环境
SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=amd64
- 然后直接执行go build,则会生成文件名为test的二进制文件