私有模块
Go 模块经常在公共互联网上不可用的版本控制服务器和模块代理上开发和分发。 go
命令可以从私有源下载和构建模块,但它通常需要一些配置。
下面的环境变量可用于配置对私有模块的访问。 有关详细信息,请参阅 环境变量。 另请参阅隐私,了解有关控制发送到公共服务器的信息的信息。
GOPROXY
- 模块代理 URL 列表。go
命令将尝试按顺序从每个服务器下载模块。 关键字direct
指示go
命令从开发模块的版本控制存储库下载模块,而不是使用代理。GOPRIVATE
- 应该被视为私有的模块路径前缀的 glob 模式列表(注:glob 是用于匹配符合指定模式的文件集合的一种语言,下同)。 充当“GONOPROXY”和“GONOSUMDB”的默认值。GONOPROXY
- 不应从代理下载的模块路径前缀的 glob 模式列表。go
命令将从它们开发的版本控制存储库中下载匹配的模块,而不管GOPROXY
。GONOSUMDB
- 不应使用公共校验和数据库 sum.golang.org 检查的模块路径前缀的 glob 模式列表。GOINSECURE
- 可以通过 HTTP 和其他不安全协议检索的模块路径前缀的 glob 模式列表。
这些变量可以在开发环境中设置(例如,在.profile
文件中),也可以使用 go env -w
。
其余部分介绍了用于提供对专用模块代理和版本控制存储库访问的常见模式。
服务所有模块的私人代理
服务于所有模块(公共和私有)的中央私有代理服务器为管理员提供了最多的控制,并且需要对单个开发人员的最少配置。
要配置go
命令使用此类服务器,请设置以下环境变量,替换https://proxy.corp.example.com
与您的代理URL和corp.example.com
使用您的模块前缀:
GOPROXY=https://proxy.corp.example.com
GONOSUMDB=corp.example.com
GOPROXY
设置指示go
命令仅从https://proxy.corp.example.com
下载模块。go
命令不会连接到其他代理或版本控制存储库。
GONOSUMDB
设置指示go
命令不使用公共校验和数据库来验证使用corp.example.com
的路径的模块。
在此配置中运行的代理可能需要读访问私有版本控制服务器。它还需要访问公共互联网以下载新版本的公共模块。
有几种现有的goproxy
服务器可以使用这种方式。最小实现将从Module缓存目录中服务于文件,并将使用go mod download(具有适当的配置)来检索缺失的模块。
私人代理服务私有模块
私有代理服务器可以提供私有模块,而无需提供公开的模块。go
命令可以配置为返回私有服务器上不可用的模块的公共源。
要配置go
命令以这种方式工作,请设置以下环境变量,替换https://proxy.corp.example.com
使用代理URL和corp.example.com
使用模块前缀:
GOPROXY=https://proxy.corp.example.com,https://proxy.golang.org,direct
GONOSUMDB=corp.example.com
GOPROXY
设置指示go
命令尝试从https://proxy.corp.example.com
首先下载模块。如果该服务器以404(未找到)或410(不到)响应,则go
命令将返回到https://proxy.golang.org
,然后直接连接到存储库。
GONOSUMDB
设置指示go
命令不使用公共校验和数据库来验证路径以corp.example.com
启动的模块。
请注意,此配置中使用的代理仍可能控制对公共模块的访问,即使它不为其提供服务。如果代理响应于404或410以外的错误状态的请求,则go
命令不会返回到GOPROXY
列表中的稍后条目。例如,代理可以使用具有不合适许可证或已知安全漏洞的模块来响应403(禁止)。
直接访问私有模块
go
命令可以配置为绕过公共代理并直接从版本控制服务器下载私有模块。对于运行私有代理服务器不可行时,这是有用的。
要配置go
命令以此方式工作,请设置GOPRIVATE
,替换corp.example.com
私有模块前缀:
GOPRIVATE=corp.example.com
在这种情况下,不需要改变 GOPROXY
变量。它默认为https:///proxy.golang.org ,direct
,指示go
命令尝试首先从https://proxy.golang.org
下载模块,如果该代理响应404(未找到)或410(不到),则返回直接连接。
GOPRIVATE
设置指示go
命令不连接到代理或以corp.example.com
为前缀的模块校验和数据库。
仍然可能需要内部HTTP服务器将Module路径解析为存储库URL。例如,当go
命令下载模块corp.example.com/mod
时,它将会把get请求发送到https://corp.example.com/mod?go-get=1
,它将在响应中查找存储库URL。为避免此要求,请确保每个私有模块路径具有VCS后缀(如.git
)标记存储库根前缀。例如,当go
命令下载模块corp.example.com/repo.git/mod
时,它将克隆git存储库 https://corp.example.com/repo.git
或ssh://corp.example.com/repo.git
且不需要进行额外请求。
开发人员需要读访问包含私有模块的存储库。这可以在全局VCS配置文件中配置,例如.gitconfig
。如果VCS工具配置不需要交互式身份验证提示,最好是。默认情况下,在调用Git时,go
命令通过设置GIT_TERMINAL_PROMPT=0
禁用交互式提示,但它尊重显式设置。
将凭据传递给私人代理
go
命令支持HTTP 基本身份验证,当与代理服务器通信时。
可以在.netrc
文件中指定凭据。例如,包含下面的行的.netrc
文件将配置go
命令连接到计算机proxy.corp.example.com
与给定的用户名和密码。
machine proxy.corp.example.com
login jrgopher
password hunter2
可以使用NETRC
环境变量设置文件的位置。如果未设置NETRC
,则go
命令将读取在Unix的平台上$HOME/.netrc
或在Windows上 %USERPROFILE%\_netrc
。
.netrc
中的字段是用空格,选项卡和ewhlines分隔。不幸的是,这些字符不能用于用户名或密码。请注意,机器名称不能是完整的URL,因此无法为同一台计算机上的不同路径指定不同的用户名和密码。
或者,可以直接在 GOPROXY
URLs中指定凭证。例如:
GOPROXY=https://jrgopher:hunter2@proxy.corp.example.com
采用此方法时,请小心:环境变量可能出现在shell历史记录中和日志中。
将凭据传递给私人存储库
go
命令可以直接从版本控制存储库下载模块。如果未使用私有代理,这对于私有模块是必要的。请参阅直接访问私有modules进行配置。
go
命令在直接下载模块时运行像git
这样的版本控制工具。这些工具执行自己的身份验证,因此您可能需要在特定于工具的配置文件中配置凭据,如.gitconfig
。
为确保顺利进行工作,请确保go
命令使用正确的存储库URL,并且版本控制工具不需要交互方式输入密码。go
命令更衷于https://
URL,例如ssh://
,除非在查找存储库URL时是否指定了该方案。对于GitHub存储库,特别是GO
命令默认请求https://
。
对于大多数服务器,您可以将客户端配置为通过HTTP进行身份验证。例如,GitHub支持使用
OAuth Personal Access Token作为HTTP密码。您可以在.netrc
文件中存储HTTP密码,如将凭据传递给私有代理。
或者,您可以将https://
URLs重写为另一个方案。例如,在.gitconfig
中:
[url "git@github.com:"]
insteadOf = https://github.com/
有关更多信息,请参阅为什么“Go Get”在克隆存储库时使用HTTPS?
隐私
go
命令可以从模块代理服务器和版本控制系统下载模块和元数据。环境变量GOPROXY
使用该服务器的控制器。环境变量GOPROXY
和GOPROXY
控制从代理中取出模块。
GOPROXY
的默认值为:
https://proxy.golang.org,direct
使用此设置,当go
命令下载模块或模块元数据时,它将首先向proxy.golang.org
发送由Google操作的公共模块代理(隐私政策)。有关在每个请求中发送的详细信息,请参阅GOPROXY
协议。go
命令不传输个人可识别的信息,但它确实发送了所请求的完整模块路径。如果代理用404(未找到)或410(失效)状态响应,则go
命令将尝试直接连接到提供模块的版本控制系统。有关详细信息,请参见Version控制系统。
GOPRIVATE
或GONOPROXY
环境变量可以设置为匹配私有的模块前缀的Glob模式的列表,不应从任何代理请求。例如:
GOPRIVATE=*.corp.example.com,*.research.example.com
GOPRIVATE
仅作为 GONOPROXY
和GONOSUMDB
的默认用作默认的作用,因此没有必要设置GONOPROXY
除非GONOSUMDB
应该有不同的价值。当模块路径由GONOPROXY
匹配时,go
命令忽略该模块的GONOPROXY
,直接从其版本控制存储库获取。当没有代理服务私有模块时,这很有用。请参阅直接访问私有模块。
如果存在信任代理服务所有模块,则不应设置GONOPROXY
。例如,如果GONOPROXY
设置为一个源,则go
命令不会从其他源下载模块。GONOSUMDB
仍然应该在这种情况下设定。
GOPROXY=https://proxy.corp.example.com
GONOSUMDB=*.corp.example.com,*.research.example.com
如果存在仅限私人模块的可信代理,不应设置GONOPROXY
,但要小心必须是采取以确保代理响应正确的状态代码。例如,考虑以下配置:
GOPROXY=https://proxy.corp.example.com,https://proxy.golang.org
GONOSUMDB=*.corp.example.com,*.research.example.com
假设由于拼写错误,开发人员尝试下载不存在的模块。
go mod download corp.example.com/secret-product/typo@latest
go
命令首先请求来自proxy.corp.example.com
的该模块。如果该代理用404(未找到)或410(失效),则go
命令将返回proxy.golang.org
,传输secret-product
请求URL中的路径。如果私有代理与任何其他错误代码响应,则go
命令打印错误,不会返回其他源。
除了代理之外,go
命令可以连接到校验和数据库,以验证在go.sum
中未列出的模块的加密障碍。GOSUMDB
环境变量设置校验和数据库的名称,URL和公钥。GOSUMDB
的默认值是sum.golang.org
,由Google操作的公共校验和数据库(隐私政策) 。有关使用每个请求传输的详细信息,请参见Checksum数据库。与代理一样,go
命令不发送个人识别信息,但它确实发送了所请求的完整模块路径,并且校验和数据库不能计算非公共模块的校验和。
GONOSUMDB
环境变量可以设置为指示哪些模块是私有的,不应从校验和数据库请求。goprivate
作为GONOSUMDB
和GONOPROXY
的起作用,因此不需要设置GONOSUMDB
,除非GONOPROXY
应该有不同的价值。
一个代理可以镜像Checksum数据库。如果是在GONOPROXY
中的代理,go
命令不会直接连接到校验和数据库。
GOSUMDB
可以设置为关闭
以完全禁用校验和数据库的使用。使用此设置,go
命令将不会验证下载的模块,除非它们已在go.sum
中。请参阅Authenticating模块。
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
推荐文章: