模块相关环境变量
💥本文章所有相关go代码参考自go 1.18+版本
GO111MODULE
Go语言提供了GO111MODULE这个环境变量来作为Go modules的开关,其允许设置以下参数:auto:只要项目包含了go.mod文件(在$GOPATH/src外面且根目录有go.mod文件时)的话启用Go modules。on:启用Go modules,推荐设置,会忽略GOPATH和vendor文件夹,只根据go.mod下载依赖。off:禁用Go modules,不推荐设置,会从GOPATH和vendor文件夹寻找包。
GO111MODULE相关解释:GO111MODULE这个命名代表着Go语言在1.11版本添加的,针对Module的变量。- 像是在
Go1.5版本的时候,也发布了一个系统环境变量GO15VENDOREXPERIMENT。 - 作用是用于开启
vendor目录的支持,当时其默认值也不是开启,仅仅作为experimental。 - 其随后在
Go1.6版本时也将默认值改为了开启,并且最后作为了official,GO15VENDOREXPERIMENT系统变量就退出了历史舞台。 - 而未来
GO111MODULE这一个系统环境变量也会面临这个问题,不去除是为了兼容老版本。
$ go env -w GO111MODULE=auto
GOPROXY
- 这个环境变量主要是用于设置
Go模块代理,直接通过镜像站点来快速拉取。 GOPROXY的默认值是:https://proxy.golang.org,direct,这有一个很严重的问题,就是https://proxy.golang.org在国内是无法访问的。- 在该配置下,
go命令首先去Google运行的Go模块镜像,如果镜像没有模块,则回退到直接连接。 - 可以设置
GOPRIVATE和GONOPROXY环境变量以防止使用代理下载特定模块。
- 在该配置下,
- 中国大陆推荐使用
go env -w GOPROXY=https://goproxy.cn,direct。- 其他源地址列表:https://goproxy.cn、https://goproxy.io、https://goproxy.baidu.com/。
GOPROXY的值是一个以英文逗号(,)或竖线(|)分割的Go模块代理列表,允许设置多个模块代理。- 假设你不想使用,也可以将其设置为
“off”,这将会禁止Go在后续操作中使用任何Go模块代理。也就是go env -w GOPROXY=off。 - direct 是什么?
- 是一个特殊指示符,用于指示
Go回源到模块版本的源地址去抓取(比如GitHub等)。 - 当值列表中上一个
Go模块代理返回404或410错误时,Go自动尝试列表中的下一个。 - 遇见
“direct”时回源,也就是回到源地址去抓取,而遇见EOF时终止并抛出类似“invalid version: unknown revision...”的错误。
- 是一个特殊指示符,用于指示
- 模块代理
URL列表,以逗号 (,) 或竖线 (|) 分隔:- 当
go命令查找某个模块的信息时,它会依次联系列表中的每个代理,直到收到成功响应或终端错误为止。 - 代理可能会以
404(未找到)或410(已消失)状态响应,以指示该模块在该服务器上不可用。
- 当
go命令的错误回退行为由URL之间的分隔符决定:,:go命令会在404或410错误后回退到下一个URL,所有其他错误都被视为终端错误。|:go命令在出现任何错误(包括超时等非HTTP错误)后回退到下一个源。
GOPROXY的URL可能具有https、http或file方案,如果URL没有方案,则假定为https。- 模块缓存可以直接用作文件代理:
go env -w GOPROXY=file://$(go env GOMODCACHE)/cache/download。 - 可以使用两个关键字代替代理
URL:off:禁止从任何来源下载模块。direct:直接从版本控制存储库下载,而不是使用模块代理。
$ go env -w GOPROXY=https://goproxy.cn,direct
GOSUMDB
- 用于在拉取模块版本时(无论是从源站拉取还是通过
Go module proxy拉取)保证拉取到的模块版本数据未经过篡改。若发现不一致,也就是可能存在篡改,将会立即中止。 GOSUMDB的默认值为:sum.golang.org,在国内也是无法访问的,但是GOSUMDB可以被Go模块代理所代理。- 因此我们可以通过设置
GOPROXY来解决,而先前我们所设置的模块代理goproxy.cn就能支持代理sum.golang.org。 - 所以这一个问题在设置
GOPROXY后,你可以不需要过度关心。
- 因此我们可以通过设置
- 另外若对
GOSUMDB的值有自定义需求,其支持如下格式:- 格式 1:
<SUMDB_NAME>+<PUBLIC_KEY>。 - 格式 2:
<SUMDB_NAME>+<PUBLIC_KEY> <SUMDB_URL>。
- 格式 1:
- 也可以将其设置为
“off”,也就是禁止Go在后续操作中校验模块版本,也就是go env -w GOSUMDB=off。 - 如果
GOSUMDB设置为off或者使用go get设置-insecure标志则不会查询校验和数据库,并接受所有无法识别的模块。- 代价是放弃对所有模块进行已验证的可重复下载的安全保证。
- 绕过特定模块的校验和数据库的更好方法是使用
GOPRIVATE或GONOSUMDB环境变量。
- 相关参考文档:https://goproxy.io/zh/docs/GOSUMDB-env.html。
GOPRIVATE
- 用于当前项目依赖了私有模块,如你公司的私有
git仓库,又或是github中的私有库,都是属于私有模块,都是要进行设置的,否则会拉取失败。- 就是依赖了由
GOPROXY指定的Go模块代理或由GOSUMDB指定Go checksum database都无法访问到的模块时的场景。
- 就是依赖了由
- 以英文逗号
“,”分割的模块路径前缀,也就是可以设置多个,例如:go env -w GOPRIVATE="git.example.com,github.com/helium/bms"。- 设置后,前缀为
git.xxx.com和github.com/helium/bms的模块都会被认为是私有模块。
- 如果不想每次都重新设置,我们也可以利用通配符,例如:
go env -w GOPRIVATE="*.example.com"。- 这样子设置的话,所有模块路径为
example.com的子域名(例如:git.example.com)都将不经过Go module proxy和Go checksum database。 - 需要注意的是不包括
example.com本身。
- 相关参考文档:https://goproxy.io/zh/docs/GOPRIVATE-env.html。
GONOPROXY
- 用于指定不使用模块代理(如proxy.golang.org)下载模块的模块路径前缀列表。
- 模块代理是Go 1.13及以上版本推出的功能,用于缓存公共模块,以加快模块下载速度和提高模块下载的可靠性。
- 该变量包含一个由逗号分隔的模块路径前缀列表。
- 如果你有一个私有模块存储在 git.example.com,并希望Go命令直接从该仓库下载模块而不是通过模块代理,你可以设置
GONOPROXY=git.example.com。
GONOSUMDB
- 用于指定不检查其校验和的模块路径前缀列表。
- Go modules使用校验和数据库(如sum.golang.org)来确保下载的模块版本没有被篡改。
- 与
GONOPROXY类似,该变量也包含一个由逗号分隔的模块路径前缀列表。 - 假设你有私有模块并且不希望Go命令尝试验证这些模块的校验和,你可以设置
GONOSUMDB=git.example.com。
GOVCS
- 控制
go命令可以用来下载公共和私有模块,(由它们的路径是否与GOPRIVATE中的模式匹配)或其他与glob模式匹配的模块的版本控制工具集。 - 如果未设置
GOVCS,或者模块与GOVCS中的任何模式都不匹配,则go命令可能对公共模块使用git和hg,或对私有模块使用任何已知的版本控制工具。 - 具体来说,
go命令就像GOVCS被设置为(默认模式):public:git|hg,private:all。