关于“GoPath和Go Module”的一点理解
GOPATH 模式下没有版本控制的概念,具有致命的缺陷,至少会造成以下问题:
- 在执行
go get
的时候,你无法传达任何的版本信息的期望,也就是说你也无法知道自己当前更新的是哪一个版本,也无法通过指定来拉取自己所期望的具体版本。 - 在运行 Go 应用程序的时候,你无法保证其它人与你所期望依赖的第三方库是相同的版本,也就是说在项目依赖库的管理上,你无法保证所有人的依赖版本都一致。
- 你没办法处理 v1、v2、v3 等等不同版本的引用问题,因为 GOPATH 模式下的导入路径都是一样的,都是
github.com/foo/bar
。 - Go 语言官方从 Go1.11 起开始推进 Go modules(前身vgo),Go1.13 起不再推荐使用 GOPATH 的使用模式,Go modules 也渐趋稳定,因此新项目也没有必要继续使用GOPATH模式。
GOPATH 做为 Golang 的第一个包管理模式,只能保证你能用,但不保证好用,而 go vendor 解决了 GOPATH 忽视包版的本管理,保证好用,但是还不够好用,直到 go mod 的推出后,
才使 Golang 包的依赖管理有了一个能让 Gopher 都统一比较满意的方案,达到了能用且好用的标准。
如果是刚开始学习 Golang ,那么 GOPATH 和 go vendor 可以做适当了解,不必深入研究,除非你要接手的项目由于一些历史原因仍然在使用 go vender 械管理,除此之外,任何 Gopher 应该从此刻就投入 go modules 的怀抱。
Go1.13开始不再推荐使用GOPATH。意思就是说你可以在任何路径下存放你的Go源码文件, 不用再像以前一样非得放到$GOPATH/src中。 每一个go项目 都是一个 Module。
在用像vscode打开时,一般情况下如果是单工程的话,就直接打开这个go mod的文件夹就可以,如果打开多个go mod工程的父目录,则需要配置多工程的参数(https://github.com/golang/tools/blob/master/gopls/doc/workspace.md),否则会报错。
Go Mod 命令:
命令 |
作用 |
go mod init 工程名(一般和根文件夹的名字一样) |
生成 go.mod 文件,一个go mod工程一个go.mod文件, 并且一定要在工程的根目录 |
go mod download |
下载 go.mod 文件中指明的所有依赖 |
go mod tidy |
整理现有的依赖 |
go mod graph |
查看现有的依赖结构 |
go mod edit |
编辑 go.mod 文件 |
go mod vendor |
导出项目所有的依赖到vendor目录 |
go mod verify |
校验一个模块是否被篡改过 |
go mod why |
查看为什么需要依赖某模块 |