Go 是一门静态强类型语言,与其他语言一样,Go 语言通过 package 关键字定义一个包。前面一篇文章主要介绍了 Go 语言的包依赖管理。
在同一个包内定义的func、type、变量、常量,在该 package下的所有文件下的代码都可以随意访问,属于包内公开。我们通过 package 关键字定义 main 包,在 Go 中规定主函数 #main 必须位于 main 包下。
Go 的代码复用很大程度依赖于包基础上,而包管理很大程度依赖于 GOPATH。Go 的包管理一直饱受诟病,不过自 1.11 版本发布 Go Modules 以来已经出现很大程度的改善。本文将会具体介绍 GOPATH 和 Module 的相关实践。
GOPATH 工作目录是 Go 项目的开发空间,它是一个目录结构,一般由三个子目录组成:
而 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 于 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 build
和 go install
将自动使用 go.mod
中依赖关系,减少了 GOPATH 管理时的复杂性。
本文主要介绍了 Go 语言的包依赖管理 GOPATH 和 Go Module 。GOPATH 工作目录是 Go 项目的开发空间,它是一个目录结构,一般由三个子目录组成。Go Modules 于 1.11 版本初步引入,在 1.12 版本中正式支持,它是 Go 官方提供的包管理解决方法。通过 Go Modules,我们可以不必将项目放置到 GOPATH 位置上。
下一篇文章将会开始介绍 Go 语言的反射相关内容,这也是用好 Go 语言所必须掌握的知识点。