go包管理详解

Go中包的概念

Golang中,包是函数和数据的集合,将有相关特性的函数和数据放在统一的目录进行管理,每个包都可以作为独立的单元维护并提供给其他项目进行使用。

golang中包的管理方式

Go1.11版本提供Go modules机制对包进行管理,同时保留GOPATH和vendor机制,使用临时环境变量GO111MODULE进行控制,GO111MODULE有三个可选值:

  1. G0111MODULE=off时,构建项目始终在COPATH和vendor目录搜索目标程序依赖包。
  2. G0111MODULE=on时,构建项目则始终使用Go modules机制,在 GOPATH/pkg/mod目录搜索目标程序依赖包。
  3. GO111MODULE=auto时,构建源代码不在GOPATH/src的子目录且包含go.mod文件,则使用Go modules机制,否则使用GOPATH和vendor机制。

当前Go Modules已成为默认的依赖管理方式。因此我们只需详细学习Go Modules包管理方式即可。

  1. 查看当前GO111MODULE:GO111MODULE=auto
  2. 临时设置当前GO111MODULE:export GO111MODULE=auto
  3. 永久设置GO111MODULE:将上述命令添加到shell 配置文件中,例如 ~/.bashrc 或 ~/.bash_profile。编辑其中一个文件并在末尾添加上述命令,最后保存并退出编辑器。

go modules

使用Go modules的优势

  1. 项目不必放在 GOPATH/src内,一个源代码目录甚至是空目录都可以作为一个模块,只要其中包含go.mod文件
  2. 通过go.mod项目可以自动下载依赖管理
  3. 项目内会生成一个 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文件中

  1. module genchat:这个指令指定了当前模块的名称,即项目的模块路径。

  2. go 1.20:这个指令指定了当前项目的 Go 版本要求。在这个例子中,项目要求 Go 版本为 1.20。

  3. require:这个指令用于指定项目的直接依赖关系,即项目build用到的Go模块,在这个部分中列出了项目直接依赖的模块及其版本号。

  4. // indirect:这个注释用于标记间接依赖。间接依赖是指当前模块的直接依赖项所引入的依赖。在这个例子中,被标记为间接依赖的模块是项目的间接依赖,而不是直接依赖。

  5. 当执行 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 命令有如下几个:

  1. go mod init
    用法:go mod init example
    (go mod init 后面需要跟一个名字,这里叫example)
    此命令会初始化当前工作目录为一个Go模块,模块名为example,并在当前目录下生成一个 go.mod 文件。

  2. go mod tidy
    用法go mod tidy -v
    Go不会移除go.mod文件中的无用依赖。所以当你的依赖中有些使用不到了,可以使用go mod tidy命令来清除它。go mod tidy可以添加缺失的模块以及移除不需要的模块。
    添加参数-v,例如go mod tidy -v可以将执行的信息,即移除和添加的模块打印到标准输出。

  3. go mod download
    用法go mod download [-dir] [-json] [modules]
    go mod download 命令用于下载当前项目的所有依赖项的模块,并将它们存储在 $GOPATH/pkg/mod 目录下。它通常不需要提供任何参数,因为它会自动读取当前目录下的 go.mod 文件,并下载其中指定的所有依赖项。

  4. go mod verify
    用法go mod verify
    go mod verify 命令用于验证项目的依赖项的完整性,保护项目免受恶意篡改,并确保构建的一致性。

利用Go 的 module 特性,再也不需要关心GOPATH了, 我们可以在任何位置新建一个Golang项目,同时通过go.mod文件利用go mod 命令下载文件的依赖项。

Logo

一起探索未来云端世界的核心,云原生技术专区带您领略创新、高效和可扩展的云计算解决方案,引领您在数字化时代的成功之路。

更多推荐