Go 使用
Go 使用
包管理
GoPath 的坑
当使用 go get <package>
时,GoPath 会在 GOPATH 路径(一个环境变量)上安装第三方包。
并且在 Go 里,你的代码必须放在 GOPATH 里才能运行。
会有两种选择:
不同项目使用不同的 $GOPATH:这个优点很明显,就像 javascript 里的 node_modules 一样,不同项目自有一套自己的依赖。缺点也很明显,一是重复下载相同的依赖,占用空间大;二是 GoPath 非常垃圾,你下载的第三方包会直接下到你的 src 文件夹里,就是说和你自己写的代码放在一起,导致目录结构极其混乱,意义不明。
不同项目使用同一个 $GOPATH:解决了重复依赖占用空间的问题,但是项目结构就会极其极其混乱,不仅不同项目文件混在一起,而且还和第三方包混在一起。
使用Gomodule
令人震惊的是,Go 居然直到 1.11 版本才解决这个问题
解决方案就是 GoModule。
GoModule 解决的问题非常简单,就是在 GoPath 之外再弄一个 GoModule 目录(就是 go mod init
的那个目录),这样自己的代码安装在 GoModule 目录里,第三方则安装在 GoPath 目录里。虽然我不知道为什么这种东西还要等 1.11 版本才能出来,但这就是 GO。
GoModule 的优势:
- 如上面所说,自己的代码和第三方包分成了两个路径,项目结构的问题解决了。
- 这样就可以只设置一个 GoPath,所有项目共用这一个 GoPath,依赖重复的问题也解决了。
- GoModule 终于有了依赖管理,终于有了版本管理,版本冲突问题也得到了控制。(但是看网上一些帖子说还是很垃圾,这个等我遇到了再提)
在 GoPath 时代,代码只能在 GoPath 上运行,而有了 GoModule 之后,就可以在 GoModule 目录上运行代码。而 GoPath 只是作为一个仓库存放第三方包了。
创建项目
在GoPath外,使用Go mod init 需要+项目名,否则会出现 outside GoPath的错误,
而项目在GoPath下创建,则可以直接使用Go mod init 命令,原因是在GoPath下可以发现项目名。
所以新建项目的步骤:
- 创建项目:
- 命令行:go mod init 项目名
- 使用第三方包的时候,需要go mod tidy 将第三方包的依赖引入,第三方包存在GoPath中,避免重复下载