踩坑
当你开启了GO111MODULE,仍然使用GOPATH模式的方法,在引入自定义模块时会报错。
GO111MODULE 有三个值:off, on和auto(默认值)。
- GO111MODULE=off,go命令行将不会支持module功能,寻找依赖包的方式将会沿用旧版本那种通过vendor目录或者GOPATH模式来查找。
- GO111MODULE=on,go命令行会使用modules,而一点也不会去GOPATH目录下查找。
- GO111MODULE=auto,默认值,go命令行将会根据当前目录来决定是否启用module功能。这种情况下可以分为两种情形:
- 当前目录在GOPATH/src之外且该目录包含go.mod文件
- 当前文件在包含go.mod文件的目录下面。
当modules 功能启用时,依赖包的存放位置变更为$GOPATH/pkg,允许同一个package多个版本并存,且多个项目可以共享缓存的 module。
(1)使用了相对路径:import "./models"
报错:build command-line-arguments: cannot find module for path /D/dev这里后面一堆本地路径 这是因为在go module下 你源码中 impot …/ 这样的引入形式不支持了, 应该改成 impot 模块名/ 。 这样就ok了
(2)使用结合了GOPATH的形式:import "Go-Player/src/ademo/models"
于是我们把上面的import改成了结合GOPATH的如上形式
- 报错:package Go-Player/src/ademo/models is not in GOROOT D:/development/go/src/GPlayer/src/ademo/models
(3)彻底解决方法:用go env -u 恢复初始设置
不再使用go mod:
- go env -w GO111MODULE=off 或者 go env -w GO111MODULE=auto
- go env -u GO111MODULE
区别在于,如果GO111MODULE=on或者auto,**在go get下载包时候,会下载到GOPATH/pkg/mod,引入时也是同样的从这个目录开始。**如果这行了上述命令,那么在go get下载包时候,会下载到GOPATH/src 目录下。
go install#
go install表示安装的意思,它先编译源代码得到可执行文件,然后将可执行文件移动到GOPATH的bin目录下。因为我们的环境变量中配置了GOPATH下的bin目录,所以我们就可以在任意地方直接执行可执行文件了。
跨平台编译#
默认我们go build的可执行文件都是当前操作系统可执行的文件,如果我想在windows下编译一个linux下可执行文件,那需要怎么做呢?
只需要指定目标操作系统的平台和处理器架构即可:
SET CGO_ENABLED=0 // 禁用CGO
SET GOOS=linux // 目标平台是linux
SET GOARCH=amd64 // 目标处理器架构是amd64
使用了cgo的代码是不支持跨平台编译的
然后再执行go build命令,得到的就是能够在Linux平台运行的可执行文件了。
Mac 下编译 Linux 和 Windows平台 64位 可执行程序:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build
Linux 下编译 Mac 和 Windows 平台64位可执行程序:
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build
Windows下编译Mac平台64位可执行程序:
SET CGO_ENABLED=0
SET GOOS=darwin
SET GOARCH=amd64
go build
问题:#
1、$GOPATH/go.mod exists but should not
开启模块支持后,并不能与GOPATH共存,所以把项目从GOPATH中移出即可
2、解决go 生成的exe不在bin文件夹里的问题
解决
控制台执行go install
补充:go install之后没有生成bin目录的原因(环境变量GOBIN)
运行go install HelloWorld,没有报错,但工作空间里也没有生成bin目录。
想起刚才重新配置环境变量时,把GOBIN也给配置了:/usr/local/go/bin。
所以导致install生成的bin并没在当前工作空间生成对应打bin目录,而是把文件直接生成到里/usr/local/go/bin里。
把GOBIN重新置为了默认的空,source之后并没成功。
因为用的LiteIDE,它打环境变量没有更新过来,重启LiteIDE也没好使。
最后把系统注销重新登录了一下好使了