目录
(3) 编译的时候显示package XXX is not in GOROOT
最近在写实时数据库项目的时候,之前一直使用的是Gopath来进行go环境的配置,但是随时项目需要的第三方模块变多,项目的迁移和管理会很费劲,所以换成了go mod即模块的形式来进行包的管理,在这里分享一下我的使用心得以及在使用过程中遇到的坑。
1.开启Go Mod
众所周知,在go中,第三包的包都会默认放在GoPath/src目录下,在Go1.1之后引入了GoModule的概念,对应的环境变量为GO111MODULE(111就是1.11版本),我们通过使用命令go env -w GO111MODULE=on即可开启go module,在开启了go mod模式之后之前的gopath将不再起作用,整个编译过程将使用go mod来进行控制
2.配置代理
由于某些原因,国外的很多网站不能直接访问,我们可以使用代理来下载go module,这里我使用的是GoProxy
2.编写go.mod
如前所述,在开启go mod 模式之后之前配置的gopath将不会起作用,所有使用mod模型下载的模块将放在gopath/pkg/mod文件夹下,我们可以通过编写go.mod文件来方便的进行包的管理。
我们在main函数所在的同级目录下编写go.mod文件,直接使用go mod init moduleName(自定义的文件名),这样就可以生成go.mod文件,使用go list可以列出所有的使用到的模块,使用go mod download可以自动下载对应的模块
3.实战
我们的项目结构如图所示,以前是使用的gopath进行配置,所以可以看到有对应的bin和pkg文件夹,而src中对应的就是源文件
我们首先进入src文件夹及main函数所在的文件夹中,使用go mod init gdb来生成go.mod文件,再使用 go list和go download来下载对应的模块,最终go.mod的内容如下,并且还会自动帮我们生成go.sum文件
module gdb
go 1.15
require (
github.com/360EntSecGroup-Skylar/excelize/v2 v2.3.2
github.com/ahmetb/go-linq/v3 v3.2.0
github.com/deckarep/golang-set v1.7.1
github.com/dlclark/regexp2 v1.4.0 // indirect
github.com/dop251/goja v0.0.0-20210120143036-e933a5491723
github.com/dop251/goja_nodejs v0.0.0-20201222133159-1629e8d0b836
github.com/gin-contrib/cors v1.3.1
github.com/gin-contrib/pprof v1.3.0
github.com/gin-gonic/gin v1.6.3
github.com/go-sourcemap/sourcemap v2.1.3+incompatible // indirect
github.com/json-iterator/go v1.1.10
github.com/shirou/gopsutil/v3 v3.20.12
github.com/sirupsen/logrus v1.7.0
github.com/syndtr/goleveldb v1.0.0
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a
github.com/mattn/go-sqlite3 v1.10.0
)
并且可以看到此时Goland中的External Libraries中已经有了我们自定义的gdb,整个的go mod的配置已经完毕!
4.遇到的坑
(1) 使用go mod后GoLand中代码没有提示
遇到这种情况,你可能需要这样设置一下
(2) 某些包没有版本,使用go mod进行控制比较麻烦
例如我在项目中使用到的第三方并发库cmap就是这样的,维护者没有提供版本信息,这个使用使用go mod来管理比较困难,因为go mod中必须要有module version info。这里我使用的的方法是直接将源代码下载下来放在项目中。。。
(3) 编译的时候显示package XXX is not in GOROOT
遇到这种情况你可以参考https://www.cnblogs.com/wind-zhou/p/12824857.html
4.总结
总的来说使用go mod可以很方便的进行整个项目包的管理,推荐大家使用这种方式~