GitLab 的 Go 代理
- 层级:免费版、高级版、旗舰版
- 提供:GitLab.com、GitLab 自托管、GitLab 专属
- 状态:实验性
此功能的可用性由功能开关控制。 有关更多信息,请查看历史记录。 此功能可用于测试,但尚未准备好用于生产环境。 请参见 epic 3043。
通过 GitLab 的 Go 代理,GitLab 中的每个项目都可以使用 Go 代理协议 进行获取。
GitLab 的 Go 代理是一个 实验性功能,由于大型仓库可能存在的性能问题,尚未准备好用于生产环境。请参见 issue 218083。
即使启用了 Go 代理,GitLab 也不会在包注册表中显示 Go 模块。请参见 issue 213770。
有关 Go 代理使用的具体 API 端点的文档,请参阅 Go 代理 API 文档。
将 GitLab 作为 Go 代理添加
要使用 GitLab 作为 Go 代理,您必须使用 Go 1.13 或更高版本。
可用的代理端点用于按项目获取模块:/api/v4/projects/:id/packages/go
要从 GitLab 获取 Go 模块,请将项目特定的端点添加到 GOPROXY。
Go 会查询该端点,并在失败时回退到默认行为:
go env -w GOPROXY='https://gitlab.example.com/api/v4/projects/1234/packages/go,https://proxy.golang.org,direct'在此配置下,Go 按以下顺序获取依赖项:
- Go 尝试从项目特定的 Go 代理获取。
- Go 尝试从
proxy.golang.org获取。 - Go 直接通过版本控制系统操作(如
git clone、svn checkout等)获取。
如果未指定 GOPROXY,Go 会执行步骤 2 和 3,这相当于
将 GOPROXY 设置为 https://proxy.golang.org,direct。如果 GOPROXY
仅包含项目特定端点,Go 仅查询该端点。
有关如何设置 Go 环境变量的详细信息,请参阅 设置环境变量。
从私有项目获取模块
go 不支持通过不安全连接传输凭据。以下步骤仅在 GitLab 配置为 HTTPS 时有效:
- 配置 Go 在从 GitLab Go 代理获取时包含 HTTP 基本身份验证凭据。
- 配置 Go 跳过从公共校验和数据库下载私有 GitLab 项目的校验和。
启用请求认证
创建一个 个人访问令牌,将范围设置为 api 或 read_api。
打开您的 ~/.netrc 文件
并添加以下文本。将 < > 中的变量替换为您的值。
如果您使用无效的 HTTP 凭据发出 go get 请求,您将收到 404 错误。
如果您使用名为 NETRC 的环境变量,Go 会将其值
用作文件名并忽略 ~/.netrc。如果您打算在 GitLab CI 中使用 ~/.netrc,
请勿使用 NETRC 作为环境变量名称。
machine <url> login <username> password <token><url>:GitLab URL,例如gitlab.com。<username>:您的用户名。<token>:您的个人访问令牌。
禁用校验和数据库查询
使用 Go 1.13 及更高版本下载依赖项时,获取的源代码会根据校验和数据库 sum.golang.org 进行验证。
如果获取的源代码的校验和与数据库中的校验和不匹配,Go 不会构建该依赖项。
私有模块构建失败,因为 sum.golang.org 无法获取私有模块的源代码,因此无法提供校验和。
要解决此问题,请将 GONOSUMDB 设置为私有项目的逗号分隔列表。有关设置 Go 环境变量的详细信息,请参阅
设置环境变量。
例如,要禁用对 gitlab.com/my/project 的校验和查询,请设置
GONOSUMDB:
go env -w GONOSUMDB='gitlab.com/my/project,<previous value>'使用 Go
如果您不熟悉管理 Go 中的依赖项,或者对 Go 不熟悉,请查阅 以下文档:
设置环境变量
Go 使用环境变量来控制各种功能。您可以通过所有常规方式管理这些变量。但是,Go 1.14 默认会读取和写入
Go 环境变量到特殊的 Go 环境文件 ~/.go/env。
- 如果设置了
GOENV为文件,Go 会改为读取和写入该文件。 - 如果未设置
GOENV但设置了GOPATH,Go 会读取和写入$GOPATH/env。
可以使用 go env <var> 读取 Go 环境变量,在 Go 1.14 及更高版本中,
可以使用 go env -w <var>=<value> 写入。例如,
go env GOPATH 或 go env -w GOPATH=/go。
发布模块
Go 模块和模块版本由源代码仓库定义,如 Git、SVN 和 Mercurial。模块是包含 go.mod 和 Go 文件的仓库。
模块版本由版本控制系统 (VCS) 标签定义。
要发布模块,请将 go.mod 和源文件推送到 VCS 仓库。要发布模块版本,请推送 VCS 标签。