go module 使用

1、介绍

go从 v1.11 以后就推出了新的包管理,go module,它和以前的$GOPATH不一样,已经不在须要src,bin这样的子目录了,一个源代码目录甚至是空目录均可以做为module,只要其中包含有go.mod文件。 git

module 是一个相关Go包的集合,它是源代码更替和版本控制的单元。模块由源文件造成的go.mod文件的根目录定义,包含 go.mod 文件的目录也被称为模块根。moudles取代旧的的基于GOPATH方法来指定在工程中使用哪些源文件或导入包。模块路径是导入包的路径前缀, go.mod 文件定义模块路径,而且列出了在项目构建过程当中使用的特定版本。 github

go1.11.1 golang

g o . mod 文件

  • go.mod 文件 定义 module 路径以及列出其余须要 在 build 时引入的模块的特定的 版本 ,以下 。 缓存

    module gomodule_demo 
    go 1.14 
    require ( 
    github.com/sirupsen/logrus v1.6.0 
    github.com/stretchr/testify v1.4.0 // indirect 
    golang.org/x/sys v0.0.0-20200116001909-b77594299b42 // indirect 
    gopkg.in/yaml.v2 v2.2.8 // indirect 
    )
  • module:用于定义当前项目的模块路径。 ide

  • go:用于标识当前模块的 Go 语言版本,值为初始化模块时的版本,目前来看还只是个标识做用。 ui

  • require:用于设置一个特定的模块版本。 命令行

  • exclude:用于从使用中排除一个特定的模块版本。 版本控制

  • replace:用于将一个模块版本替换为另一个模块版本。 code

    go.sum文件

  • 构建状态跟踪文件。它会记录当前module全部的顶层和间接依赖,以及这些依赖的校验和
  • 保留过去使用的包的版本信息,以便往后可能的版本回退
  • 必须提交到git代码仓库
    github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 
    github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 
    github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 
    ........

    环境变量——GO111MODULE

Go 1.11中module 支持临时环境变量—— GO111MODULE ,它能够设置如下三个值: off , on 或者 auto (默认)。 blog

  • 若是 GO111MODULE=off ,那么 go 命令行将不会使用新的 module 功能,相反的,它将会在 vendor 目录下和 GOPATH 目录中查找依赖包。也把这种模式叫 GOPATH模式
  • 若是 GO111MODULE=on ,那么 go 命令行就会使用 modules 功能,而不会访问 GOPATH 。也把这种模式称做 module-aware 模式,这种模式下, GOPATH 再也不在 build 时扮演导入的角色,可是尽管如此,它仍是承担着存储下载依赖包的角色。它会将依赖包放在 GOPATH/pkg/mod 目录下。
  • 若是 GO111MODULE=auto ,这种模式是默认的模式,也就是说在你不设置的状况下,就是 auto 。这种状况下, go 命令行会根据当前目录来决定是否启用 module 功能。只有当当前目录在 GOPATH/src 目录以外并且当前目录包含 go.mod 文件或者其子目录包含 go.mod 文件才会启用。

2、go mod 相关命令

go mod init 生成 go.mod 文件 (Go 1.13 中惟一一个能够生成 go.mod 文件的子命令)

go mod tidy -v 整理现有的依赖,删除未使用的依赖。

go mod vendor 导出现有的全部依赖 (事实上 Go modules 正在淡化 Vendor 的概念)

接下来使用go build -mod=vendor来构建项目, 由于在go modules模式下go build是屏蔽vendor机制的,因此须要特定参数从新开启vendor机制:
go mod graph 查看现有的依赖结构

go mod download 下载 go.mod 文件中指明的全部依赖

go mod edit 编辑 go.mod 文件

go mod verify 校验一个模块是否被篡改过

go clean -modcache 清理全部已缓存的模块版本数据。

go mod 查看全部 go mod的使用命令。

3、版本号

go module 使用

其版本格式为 “主版本号.次版本号.修订号”,版本号的递增规则以下:

  • 主版本号:当你作了不兼容的 API 修改。

  • 次版本号:当你作了向下兼容的功能性新增。

  • 修订号:当你作了向下兼容的问题修正。

go module 使用

4、实操

  • 建立一个demo目录
  • 初始化go module,生成go.mod和go.sum
  • replace替换本地包
  • 生成vendor包,使用 go build -mod=vendor

5、 总结

  1. Go modules 发布于 Go1.11,成长于 Go1.12,丰富于 Go1.13,正式于 Go1.14 推荐在生产上使用,它 出现的目的之一就是为了解决 GOPATH 的问题,也就至关因而抛弃 GOPATH 了。
  2. 通常状况, go mod initgo mod tidy -v 两个命令就够用了。
  3. 建议 export GOPROXY= https://goproxy.io下载比较快。
相关文章
相关标签/搜索