① 《快学 Go 语言》第 16 课 —— 包管理 GOPATH 和 Vendor
学习 Go 语言的模块管理功能,从 GOPATH 和 Vendor 机制开始。随着 Go 语言的发展,模块管理经历了三个阶段,分别是通过全局的 GOPATH 管理第三方包、通过 Vendor 机制将依赖包局部化,以及最新的 Go Mole 功能。
在模块管理的初期阶段,Go 语言使用全局的 GOPATH 路径来存放所有第三方依赖包。编译器在寻找包对象时,会优先检查 GOPATH 路径下的文件。通常,用户会将 GOPATH 设置为 ~/go 目录。了解三个关键子目录:src、pkg 和 bin,分别存放源代码、编译好的包对象和二进制可执行文件。
全局管理的 GOPATH 允许通过网站域名编写友好的包路径,使用 go get 指令从 GitHub、gopkg.in 和 golang.org 等网站拉取代码。此外,Go 语言提供了标准的模块结构,用户可以参照现有项目来构建自己的模块。
编写第一个模块时,需要在 GOPATH 中创建相应的目录结构,并编写代码。使用 go get 将模块提交至 GitHub。通过 go run 命令测试模块功能,然后使用 go get 更新模块至 GitHub。值得注意的是,Go 语言不推荐使用相对导入,通常建议采用绝对导入。
若遇到两个包路径的结尾相同,Go 语言支持导入语句名称替换功能来区分。此外,Go 还支持无名导入和匿名导入,但这些用法较少见且不建议使用。
Go 提供了三个指令来管理全局包:go build、go install 和 go get。go build 仅编译代码,go install 编译后安装包,而 go get 下载并编译包。在开发过程中,先执行 go build -i 可以加快运行速度。
为了解决不同项目依赖不同版本的第三方包问题,引入了 Vendor 机制。Vendor 目录将项目依赖的第三方包进行本地化管理,优先在 Vendor 中查找所需包。每个项目都有一个 Vendor 子目录,形成依赖树,但实际依赖深度通常较小。使用 Vendor 的限制是不能将依赖暴露到外部,以实现项目间版本隔离。
当需要引入具体版本的第三方包时,可以使用 Go 的依赖管理工具 Dep。Dep 管理项目配置文件 Godep.toml 和 Godep.lock,用于指定依赖规则和版本。初始化项目后,使用 dep ensure 指令确保依赖项与项目配置一致。更新版本或添加新依赖时,可执行相关 dep 命令。
尽管 Dep 工具复杂但使用简单,它支持下载新依赖、移除不使用的依赖,并确保依赖与配置文件完全匹配。Dep 虽然在 Go 社区中流行,但最终 Go 语言官方推荐使用 Go Mole 作为替代方案。