私有模块
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 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
推荐文章: