环境变量
6 分钟阅读
Environment variables 环境变量
go命令中的模块行为可以使用下面列出的环境变量进行配置。这个列表只包括与模块相关的环境变量。有关go命令识别的所有环境变量的列表,请参阅go help environment。
GO111MODULE
控制go命令是在模块感知模式还是GOPATH模式下运行。有三个值可以识别:
off:go命令忽略go.mod文件,并在GOPATH模式下运行。on(或unset):go命令在模块感知模式下运行,即使不存在go.mod文件。auto:如果当前目录或任何父目录中存在go.mod文件,go命令将以模块感知模式运行。在Go 1.15及以下版本中,这是默认的。
更多信息请参见模块感知命令。
GOMODCACHE
go命令将存储下载的模块和相关文件的目录。关于此目录结构的详细信息,请参见模块缓存。如果未设置GOMODCACHE,它默认为$GOPATH/pkg/mod。
GOINSECURE
以逗号分隔的模块路径前缀 glob 模式列表(采用 Go的 path.Match 的语法),可能总是以不安全的方式获取。仅适用于被直接获取的依赖项。与go get上的-insecure标志不同,GOINSECURE不会禁用模块校验和数据库验证(module checksum database validation)。可以用GOPRIVATE或GONOSUMDB来实现这一点。
GONOPROXY
以逗号分隔的模块路径前缀 glob 模式列表(采用Go的path.Match语法),应该总是直接从版本控制存储库获取,而不是从模块代理获取。如果没有设置GONOPROXY,它默认为GOPRIVATE。参见Privacy(隐私)。
GONOSUMDB
以逗号分隔的模块路径前缀 glob 模式列表(采用Go的path.Match语法),go 不应使用校验数据库来验证校验。如果未设置 GONOSUMDB,它默认为 GOPRIVATE。参见Privacy(隐私)。
GOPATH
在 GOPATH 模式中,GOPATH 变量是一个可能包含 Go 代码的目录列表。在模块感知模式下,module cache(模块缓存)存储在第一个 GOPATH 目录的 pkg/mod 子目录中。缓存之外的模块源代码可以存储在任何目录中。如果未设置GOPATH,它默认为用户的主目录(home directory)的go子目录。
GOPRIVATE
以逗号分隔的模块路径前缀的 glob 模式列表(采用Go的path.Match语法),应被视认为是私有的。GOPRIVATE是GONOPROXY和GONOSUMDB的默认值。参见Privacy(隐私)。GOPRIVATE 也决定了一个模块是否被视为 GOVCS 的私有模块。
GOPROXY
模块代理URL的列表,用逗号(,)或管道符 |分隔。当go命令查询有关模块的信息时,它会依次联系列表中的每个代理,直到收到成功的响应或终端错误。代理可能会响应404(Not Found)或410(Gone)状态,表示该模块在该服务器上不可用。
go命令的错误回退行为(error fallback behavior)是由URL之间的分隔符决定的。如果代理URL后面是逗号,go命令在404或410错误后会回退到下一个URL;所有其他错误都被视为终端错误。如果代理URL后面跟着管道,则go命令在出现任何错误(包括超时等非HTTP错误)后回退到下一个源。GOPROXY URLs可以有https、http或file等协议。如果一个URL没有协议,则假定为https。模块缓存可以直接作为文件代理使用:
GOPROXY=file://$(go env GOMODCACHE)/cache/download
有两个关键词可以用来代替代理URL:
off:不允许从任何源下载模块。direct: 直接从版本控制存储库下载,而不是使用模块代理。
GOPROXY默认为https://proxy.golang.org,direct。在该配置下,go命令首先联系Google运行的Go模块镜像,如果该镜像没有模块,则回退到直接连接。请参见https://proxy.golang.org/privacy了解镜像的隐私政策。可以设置 GOPRIVATE 和 GONOPROXY 环境变量,以防止使用代理下载特定模块。关于隐私代理配置的信息,请参见Privacy(隐私)。
有关如何使用代理的更多信息,请参见Module proxies(模块代理)和Resolving a package to a module(将包解析为模块)。
GOSUMDB
标识要使用的校验和数据库的名称以及可选的公钥和 URL。例如:
GOSUMDB="sum.golang.org"
GOSUMDB="sum.golang.org+<publickey>"
GOSUMDB="sum.golang.org+<publickey> https://sum.golang.org"
go命令知道sum.golang.org的公钥,也知道名称为sum.golang.google.cn(在中国大陆可用)连接到sum.golang.org数据库;使用任何其他数据库都需要显式地给出公钥。URL默认为https://后跟数据库名。
GOSUMDB默认为sum.golang.org,由Google运行的Go校验和数据库(checksum database)。有关该服务的隐私政策,请参见 https://sum.golang.org/privacy。
如果 GOSUMDB 被设置为off,或者在调用 go get 时使用了 -insecure 标志,则不会查询校验和数据库,所有未识别的模块都会被接受,代价是放弃对所有模块进行验证的可重复下载的安全保证。绕过特定模块的校验和数据库的更好方法是使用GOPRIVATE或GONOSUMDB环境变量。
更多信息请参见Authenticating modules(验证模块)和Privacy(隐私)。
GOVCS
控制go命令在下载公共和私有模块(由其路径是否匹配GOPRIVATE中的模式来定义)或其他与glob模式相匹配的模块时可以使用的版本控制工具集。如果没有设置GOVCS,或者某个模块不符合GOVCS中的任何模式,go命令可以对公共模块使用git和hg,对私有模块使用任何已知的版本控制工具。具体来说,go命令的行为就像GOVCS被设置为public:git|hg,private:all,完整的解释请参见 用GOVCS控制版本控制工具。
GOWORK
GOWORK环境变量指示go命令使用提供的go.work文件进入工作区模式。如果GOWORK被设置为off,工作区模式将被禁用。这可以用来在单模块模式下运行go命令:例如,GOWORK=off go build .在单模块模式下构建.包。如果GOWORK为空,go命令将搜索go.work文件,如工作区部分所述。