GoLang 学习笔记(二)-- GoModule 和 GoPath 的区别


---
theme: cyanosis
---
上次的笔记在 GoModule 上花了很久。依然对其半知不解。这是因为对其历史不清楚导致的:
其实 GoModule 并不是什么老概念,而是比较新版本的 go 才推出的。在此之前 go 是通过 GoPath 来管理包。

# 1. GoPath 的坑
当使用 `go get <package>` 时,GoPath 会在 GOPATH 路径(一个环境变量)上安装第三方包。
并且在 Go 里,你的代码必须放在 GOPATH 里才能运行。
那么这里就会有两种选择:
1. 不同项目使用不同的 $GOPATH:这个优点很明显,就像 javascript 里的 node_modules 一样,不同项目自有一套自己的依赖。缺点也很明显,一是重复下载相同的依赖,占用空间大;二是 GoPath 非常垃圾,你下载的第三方包会直接下到你的 src 文件夹里,就是说和你自己写的代码放在一起,导致目录结构极其混乱,意义不明。
2. 不同项目使用同一个 $GOPATH:解决了重复依赖占用空间的问题,但是项目结构就会极其极其混乱,不仅不同项目文件混在一起,而且还和第三方包混在一起。
# 2. GoModule
令人震惊的是,Go 居然直到 1.11 版本才解决这个问题,真有你的,Go。
解决方案就是 GoModule。
GoModule 解决的问题非常简单,就是在 GoPath 之外再弄一个 GoModule 目录(就是 `go mod init` 的那个目录),这样自己的代码安装在 GoModule 目录里,第三方则安装在 GoPath 目录里。虽然我不知道为什么这种东西还要等 1.11 版本才能出来,但这就是 GO。

GoModule 的优势:
1. 如上面所说,自己的代码和第三方包分成了两个路径,项目结构的问题解决了。
2. 这样就可以只设置一个 GoPath,所有项目共用这一个 GoPath,依赖重复的问题也解决了。
3. GoModule 终于有了依赖管理,终于有了版本管理,版本冲突问题也得到了控制。(但是看网上一些帖子说还是很垃圾,这个等我遇到了再提)

在 GoPath 时代,代码只能在 GoPath 上运行,而有了 GoModule 之后,就可以在 GoModule 目录上运行代码。而 GoPath 只是作为一个仓库存放第三方包了。

# 3. vscode 上 go 插件的坑
令人震惊,vscode 上的 go 插件也有坑。那就是不支持多个 module 管理。如果有多个 module 在同一个目录下,想要让 vscode 对依赖导入等正常工作,就不能在这个目录下,只能进入单独的 module 开多个。
- 然后我看了看 vscode 上 go 插件的开发者,嗯,是 go team at google,不愧是你,go。
不过官方说之后的版本会支持,等吧。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM