模块相关环境变量
💥本文章所有相关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
。