阅读 395

Go 语言入门与进阶:GOPATH 与 Go Modules

这是我参与更文挑战的第 19 天,活动详情查看: 更文挑战

前文回顾

如果你还没有 Go 语言基础,建议阅读我的 从零学 Go

本系列文章,我将会进一步加深对 Go 语言的讲解,更一步介绍 Go 中的包管理、反射和并发等高级特性,本文将会介绍 Go 包依赖管理 GOPATH 和 Go Module 的应用实践。

依赖管理

Go 的代码复用很大程度依赖于包基础上,而包管理很大程度依赖于 GOPATH。Go 的包管理一直饱受诟病,不过自 1.11 版本发布 Go Modules 以来已经出现很大程度的改善。本文我们将初步了解 Go 的包管理。

GOPATH

GOPATH 工作目录是 Go 项目的开发空间,它是一个目录结构,一般由三个子目录组成:

  • src,包含了组成各种包的源代码,一个目录就是一个包;
  • pkg,包含了编译后的类库;
  • bin,包含了编译后的可执行程序。

而 GOPATH 是 Go 中使用的一个环境变量,它使用绝对路径提供 Go 项目的工作目录。GOPATH 适合处理大量 Go 源码、多个包组合而成的复杂工程。一般建议一个项目使用一个 GOPATH,在编译的过程中就不会编译错误的代码或者版本。

通过 go install 命令,我们可以将 Go 项目代码进行编译,它将项目的编译中间文件放到 GOPATH 的 pkg 目录下,同时固定地将编译结果放在 GOPATH 的 bin 目录下。

在不依赖其他第三方工具的前提下,可以使用 go get 命令远程拉取新的依赖包。go get 借助代码管理工具(Git、SVN 等)引入远程代码或者依赖,并自动完成编译和安装,默认安装在当前工作目录的 GOPATH 下,参数为需要引入的包名。比如我们想引入 Micro-Go-Pracrise 库到当前的 GOPATH 下,可以执行以下命令:

go get github.com/keets2012/Micro-Go-Pracrise
复制代码

Go Modules

Go Modules 于 1.11 版本初步引入,在 1.2 版本中正式支持,它是 Go 官方提供的包管理解决方法。通过 Go Modules,我们可以不必将项目放置到 GOPATH 位置上。

Go Modules 和传统的 GOPATH 不同,不需要包含固定的三个子目录,一个源代码目录,甚至空目录都可以作为 Module,只要其中包含 go.mod 文件。

我们可以通过以下命令创建一个新的 Module:

go mod init [module name]
复制代码

比如我们定义一个新的 Module 为 module1,输入以下命令:

go mod init module1
复制代码

将会在当前目录生成一个 go.mod 文件,内容为:

module module1

go 1.12
复制代码

Go Modules 会为我们进行包管理,并自动更新 go.mod 文件,如果我们希望引入新的依赖,比如说引入 Micro-Go-Pracrise 库,我们可以在 go.mod 中添加以下代码:

module module1

go 1.12

require github.com/keets2012/Micro-Go-Pracrise v1.2.3
复制代码

引入 Micro-Go-Pracrise 依赖的 1.2.3 版本,接着我们可以通过执行以下命令,手动更新依赖关系:

go mod tidy
复制代码

通过 Go Modules 可以很轻易地进行一个包的依赖管理和版本控制,go buildgo install 将自动使用 go.mod 中依赖关系,减少了 GOPATH 管理时的复杂性。

小结

本文主要介绍了 Go 语言的包依赖管理 GOPATH 和 Go Module 。GOPATH 工作目录是 Go 项目的开发空间,它是一个目录结构,一般由三个子目录组成。Go Modules 于 1.11 版本初步引入,在 1.2 版本中正式支持,它是 Go 官方提供的包管理解决方法。通过 Go Modules,我们可以不必将项目放置到 GOPATH 位置上。

下一篇文章将会继续介绍 Go 语言的反射相关内容,这也是用好 Go 语言所必须掌握的知识点。

阅读最新文章,关注公众号:aoho求索

文章分类
后端
文章标签