Go modules 简介

70

Go modules 简介

Golang的版本管理视频推荐:Go with Versions - GopherConSG 2018

官网Wiki介绍:github.com/golang/go/wiki/Modules

1个开关环境变量:GO111MODULE
5个辅助环境变量:GOPROXY、GONOPROXY、GOSUMDB和GOPRIVATE
2个辅助概念:GO module proxy和GO checksum database

go.mod

go.mod是启动了Go modules的项目送必须的最重要的文件,它描述了当前项目的元信息,每一行都以一个动词开头,目前有5个动词:

  • module:用于定义当前项目的模块路径
  • go: 用于设置预期的Go版本
  • require:用于需求一个特定的模块版本
  • exclude:用于从使用中排除一个特定的模块版本
  • replace:用于将一个模块版本替换为另一个模块版本。

go.sum

go.sum详细罗列了当前项目直接或者间接依赖的所有模块,并写明了那些模块版本的SHA-256哈希值以备Go在季后的操作中保证项目所依赖的那些模块版本不会被篡改。

GO111MODULE

一共有三个值:

  • auto:只在项目包含了go.mod文件时启用Go modules,在Go1.13中仍然是默认值,详见:golang.org/issue/31857
  • on:启用Go modules
  • off:禁用Go modules

GOPROXY

它的值是一个以英文逗号分割的Go module proxy列表,用于使Go在后续拉取模块版本时能脱离传统的VCS方式从镜像站点快速拉去,它的值也可以是 off,即禁止Go从任何地方拉去模块版本。

go env -w GOPROXY=https://goproxy.cn,direct

常见的坑

主版本号问题

Go module的版本选择机制,其中介绍了一个Module的版本号需要遵循v..的格式,此外,如果major版本号大于1时,其版本号还需要体现在Module名字中。

比如Module github.com/yankooo/yaml,如果其版本号增长到v2.x.x时,其Module名字也需要相应的改变为: github.com/yankooo/yaml/v2。即,如果major版本号大于1时,需要在Module名字中体现版本。

以Module github.com/yankooo/yaml 为例,比如当前版本为 v2.3.0,因为其Module名字未遵循Golang所推荐的风格,即Module名中附带版本信息,我们称这个Module为不规范的Module。

不规范的Module还是可以引用的,但跟引用规范的Module略有差别。

如果我们在项目A中引用了该module,使用命令go mod tidy,go 命令会自动查找Module m的最新版本,即v2.3.0。 由于Module为不规范的Module,为了加以区分,go 命令会在go.mod中增加+incompatible 标识。

require (
	github.com/yankooo/yaml v2.3.0+incompatible
)

除了增加+incompatible(不兼容)标识外,在其使用上没有区别。