Go Modules 是 Go 语言的一种依赖管理方式,该 feature 是在 Go 1.11 版本中出现的,由于最近在做的项目中,团队都开始使用 go module 来替代以前的 Godep,Kubernetes 也从 v1.15 开始采用 go module 来进行包管理,所以有必要了解一下 go module。go module 相比于原来的 Godep,go module 在打包、编译等多个环节上有着明显的速度优势,并且能够在任意操作系统上方便的复现依赖包,更重要的是 go module 本身的设计使得自身被其他项目引用变得更加容易,这也是 Kubernetes 项目向框架化演进的又一个重要体现。
使用 go module 管理依赖后会在项目根目录下生成两个文件 go.mod 和 go.sum。
go.mod
中会记录当前项目的所依赖,文件格式如下所示:
1 | module github.com/gosoon/audit-webhook |
go.sum
记录每个依赖库的版本和哈希值,文件格式如下所示:
1 | github.com/elastic/go-elasticsearch v0.0.0 h1:Pd5fqOuBxKxv83b0+xOAJDAkziWYwFinWnBO0y+TZaA= |
一、如何启用 go module 功能
(1) go 版本 >= v1.11
(2) 设置GO111MODULE
环境变量
要使用go module
首先要设置GO111MODULE=on
,GO111MODULE
有三个值,off、on、auto,off 和 on 即关闭和开启,auto 则会根据当前目录下是否有 go.mod 文件来判断是否使用 modules 功能。无论使用哪种模式,module 功能默认不在 GOPATH 目录下查找依赖文件,所以使用 modules 功能时请设置好代理。
在使用 go module 时,将 GO111MODULE
全局环境变量设置为 off,在需要使用的时候再开启,避免在已有项目中意外引入 go module。
1 | $ echo export GO111MODULE=off >> ~/.zshrc |
go mod 命令的使用:
1 | download download modules to local cache (下载依赖的module到本地cache)) |
二、使用 go module 功能
对于新建项目使用 go module:
1 | $ export GO111MODULE=on |
对于已有项目要改为使用 go module:
1 | $ export GO111MODULE=on |
go.mod 文件必须要提交到 git 仓库,但 go.sum 文件可以不用提交到 git 仓库(gi t忽略文件 .gitignore 中设置一下)。
三、项目的打包
首先需要使用 go mod vendor
将项目所有的依赖下载到本地 vendor 目录中然后进行编译,下面是一个参考:
1 | #!/bin/bash |
四、注意事项
1、依赖下载
go module 默认不在 GOPATH 目录下查找依赖文件,其首先会在$GOPATH/pkg/mod
中查找有没有所需要的依赖,没有的直接会进行下载。可以使用 go mod download
下载好所需要的依赖,依赖默认会下载到$GOPATH/pkg/mod
中,其他项目也会使用缓存的 module。
2、国内无法访问的依赖
使用 Go 的其他包管理工具 godep、govendor、glide、dep 等都避免不了翻墙的问题,Go Modules 也是一样,但在go.mod
中可以使用replace
将特定的库替换成其他库:
1 | replace ( |
或者也可以在其他机器上使用 go mod download
下载好所需要的依赖,然后再传输到本机。
参考: