go包管理详解
Go中包的概念
在Golang中,包是函数和数据的集合,将有相关特性的函数和数据放在统一的目录进行管理,每个包都可以作为独立的单元维护并提供给其他项目进行使用。
golang中包的管理方式
Go1.11版本提供Go modules机制对包进行管理,同时保留GOPATH和vendor机制,使用临时环境变量GO111MODULE进行控制,GO111MODULE有三个可选值:
- 当
G0111MODULE=off
时,构建项目始终在COPATH和vendor目录搜索目标程序依赖包。 - 当
G0111MODULE=on
时,构建项目则始终使用Go modules机制,在 GOPATH/pkg/mod目录搜索目标程序依赖包。 - 当
GO111MODULE=auto
时,构建源代码不在GOPATH/src的子目录且包含go.mod文件,则使用Go modules机制,否则使用GOPATH和vendor机制。
当前Go Modules已成为默认的依赖管理方式。因此我们只需详细学习Go Modules包管理方式即可。
- 查看当前GO111MODULE:
GO111MODULE=auto
- 临时设置当前GO111MODULE:
export GO111MODULE=auto
- 永久设置GO111MODULE:将上述命令添加到shell 配置文件中,例如 ~/.bashrc 或 ~/.bash_profile。编辑其中一个文件并在末尾添加上述命令,最后保存并退出编辑器。
go modules
使用Go modules的优势
- 项目不必放在 GOPATH/src内,一个源代码目录甚至是空目录都可以作为一个模块,只要其中包含go.mod文件
- 通过go.mod项目可以自动下载依赖管理
- 项目内会生成一个 go.mod 文件,列出依赖包;所有来的第三方包会准确的指定版本号。方便进行版本控制。
go.mod文件
go.mod在Go Modules包管理方式中,起到重要作用。
包含go.mod文件的目录也被称为模块根,也就是说,go.mod 文件的出现定义了它所在的目录为一个模块。
例如在genchat目录下包含go.mod文件,其中的内容为
module genchat
go 1.20
require (
github.com/gin-gonic/gin v1.9.1
github.com/sirupsen/logrus v1.9.3
)
require (
github.com/cespare/xxhash/v2 v2.2.0 // indirect
github.com/chenzhuoyu/iasm v0.9.1 // indirect
github.com/dgryski/go-rendezvous v0.0.1
)
在这个go.mod文件中
-
module genchat:这个指令指定了当前模块的名称,即项目的模块路径。
-
go 1.20:这个指令指定了当前项目的 Go 版本要求。在这个例子中,项目要求 Go 版本为 1.20。
-
require:这个指令用于指定项目的直接依赖关系,即项目
build
用到的Go模块,在这个部分中列出了项目直接依赖的模块及其版本号。 -
// indirect:这个注释用于标记间接依赖。间接依赖是指当前模块的直接依赖项所引入的依赖。在这个例子中,被标记为间接依赖的模块是项目的间接依赖,而不是直接依赖。
-
当执行 go mod download、go build、go run 或其他需要下载依赖的命令时,Go 工具链会自动根据 go.mod 文件中的 require 指定的依赖项从代理中下载相应的模块,并将它们存储在 $GOPATH/pkg/mod 目录下。
go.mod在的文件夹即genchat成为一个可编译运行的项目,genchat中的main文件可以编译运行,并且在运行后,项目目录下多出了一个文件 go.sum。
go.sum文件是由 Go Modules 系统自动生成的用来记录项目的依赖项的精确版本和哈希值。
go mod 命令
当前Go mod提供了一系列操作modules的命令
命令语法:go mod [arguments]
。常用的go mod 命令有如下几个:
-
go mod init
用法:go mod init example
(go mod init 后面需要跟一个名字,这里叫example)
此命令会初始化当前工作目录为一个Go模块,模块名为example,并在当前目录下生成一个 go.mod 文件。 -
go mod tidy
用法go mod tidy -v
Go不会移除go.mod文件中的无用依赖。所以当你的依赖中有些使用不到了,可以使用go mod tidy命令来清除它。go mod tidy可以添加缺失的模块以及移除不需要的模块。
添加参数-v,例如go mod tidy -v可以将执行的信息,即移除和添加的模块打印到标准输出。 -
go mod download
用法go mod download [-dir] [-json] [modules]
go mod download 命令用于下载当前项目的所有依赖项的模块,并将它们存储在 $GOPATH/pkg/mod 目录下。它通常不需要提供任何参数,因为它会自动读取当前目录下的 go.mod 文件,并下载其中指定的所有依赖项。 -
go mod verify
用法go mod verify
go mod verify 命令用于验证项目的依赖项的完整性,保护项目免受恶意篡改,并确保构建的一致性。
利用Go 的 module 特性,再也不需要关心GOPATH了, 我们可以在任何位置新建一个Golang项目,同时通过go.mod文件利用go mod 命令下载文件的依赖项。