将 Go 模块存储在 Artifact Registry 中
设置一个专用 Artifact Registry Go 代码库,将模块上传到该代码库,并将该模块用作依赖项。
准备工作
-
登录您的 Google 账号。
如果您还没有 Google 账号,请注册新账号。
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Enable the Artifact Registry API.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Enable the Artifact Registry API.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
- 安装 Go 1.15 或更高版本。
- 安装
package-go-module
gcloud CLI 插件:
gcloud components install package-go-module
创建代码库
如需创建和配置新代码库,请执行以下操作:
运行以下命令创建新代码库。
gcloud artifacts repositories create REPOSITORY \ --repository-format=go \ --location=LOCATION \ --description=DESCRIPTION
替换以下内容:
运行以下命令以查看代码库详细信息。
gcloud artifacts repositories describe --location=LOCATION REPOSITORY
输出类似以下内容:
Encryption: Google-managed key Repository Size: 0.000MB createTime: '2022-06-03T20:20:01.644813Z' format: GO mode: STANDARD_REPOSITORY name: projects/my-project/locations/us-west1/repositories/my-repo updateTime: '2022-06-03T20:20:01.644813Z'
设置 gcloud 命令的默认值
您可以通过以下方式简化 gcloud CLI
命令:
配置默认值
存储库和位置值配置好默认值后
不需要 --project
、--location
和 --repository
标记。
打包并上传 Go 模块
package-go-module
gcloud CLI 插件会打包您的 Go 模块,以便您使用 gcloud
命令进行版本控制并上传到 Artifact Registry。
创建 Go 模块
首先,创建一个简单的 Go 模块以上传到代码库。
在您的主目录中,为模块创建一个名为“foo”的目录
mkdir foo
切换到模块的目录,然后运行
go mod init
以为模块创建 go.mod 文件。cd foo \ go mod init example.com/foo
将
example.com/foo
替换为模块路径。如需了解详情,请参阅 Go 模块参考文档。在 foo 目录中创建一个
foo.go
文件,其中包含以下内容:package foo const HelloWorld = "Hello World!"
打包并上传模块
打包模块并将其上传到代码库:
gcloud artifacts go upload --project=PROJECT \ --repository=REPOSITORY \ --location=LOCATION \ --module-path=example.com/foo \ --version=VERSION \ --source=SOURCE_LOCATION
替换以下内容:
- 将 PROJECT 替换为 Google Cloud 项目 ID。
- 将 REPOSITORY 替换为存储软件包的代码库的名称。
- 将 LOCATION 替换为单区域级或多区域级 位置 代码库的位置
- 将
example.com/foo
替换为模块路径。如需了解详情,请参阅 Go 模块参考文档。 - VERSION,其中包含模块的语义版本,格式为
vX.Y.Z
,其中X
是主要版本,Y
是次要版本,Z
是补丁版本。 - 将 SOURCE_LOCATION 替换为 Go 根目录的路径
模块。如果省略
--source
标志,则默认为当前目录。
该模块会上传到 Artifact Registry。
如需详细了解如何创建 Go 模块,请参阅此教程。
列出模块
如需在配置默认值后检查默认项目、代码库和位置中上传的 Go 模块,请运行以下命令:
gcloud artifacts packages list
输出类似以下内容:
Listing items under project my-project, location us-west1, repository my-repo. PACKAGE CREATE_TIME UPDATE_TIME example.com/foo 2022-06-03T20:43:39 2022-06-20T20:37:40
查看模块版本详情
运行以下命令以查看默认模块版本 创建项目、代码库和位置时 已配置默认值:
gcloud artifacts versions list --package=MODULE_PATH
输出类似以下内容:
Listing items under project my-project, location us-west1, repository my-repo, package example.com/foo. VERSION DESCRIPTION CREATE_TIME UPDATE_TIME v0.1.0 2022-06-03T20:43:39 2022-06-03T20:43:39 v0.1.1 2022-06-20T20:37:40 2022-06-20T20:37:40
下载模块
如需导入存储在 Artifact Registry 中的模块,您需要指示 Go 从 Artifact Registry 中查找依赖项,并绕过校验和数据库。
设置 Go 环境
指示 Go 按以下顺序下载模块:Artifact Registry、公共 Go 模块代理,然后是源代码:
export GOPROXY=https://LOCATION-go.pkg.dev/PROJECT/REPOSITORY,https://proxy.golang.org,direct
替换以下内容:
排除您的模块,以免使用公共校验和数据库对其进行检查:
export GONOSUMDB=MODULE_PATH_REGEX
将 MODULE_PATH_REGEX 替换为您的模块路径或正则表达式 如果您想排除多个模块。
不让公众对模块
example.com/foo
进行检查 校验和数据库,请运行以下命令:export GONOSUMDB=example.com/foo
如果您希望将模块路径以
example.com
开头的所有模块排除在使用公共校验和数据库进行检查之外,请运行以下命令:export GONOSUMDB=example.com/*
向 Artifact Registry 进行身份验证
从以下位置下载打包的 Go 模块以用作依赖项时 Artifact Registry,Go 二进制文件使用 netrc 文件中的凭据 对 Artifact Registry 进行身份验证为简化身份验证流程,您可以使用 Go 凭据帮助程序刷新 netrc 文件中的令牌,以便对 Artifact Registry 进行身份验证。
您可以使用 netrc 环境变量设置 netrc 文件的位置。如果未设置 NETRC
变量,则 go
命令将在类 UNIX 平台上读取 $HOME/.netrc
,在 Windows 上读取 %USERPROFILE%\_netrc
。
Artifact Registry 支持以下身份验证方法。
- 短期凭据(推荐)
- 使用 Artifact Registry Go 凭据帮助程序工具更新 netrc 文件中的身份验证令牌。
- 使用服务账号密钥
如果您无法在自己的环境中将凭据用于 身份验证。将未加密的服务账号密钥添加到您的 netrc 文件中。
将 Go 凭据帮助程序添加到 GONOPROXY
在使用 Go 凭据帮助程序之前,您需要将其添加到 GONOPROXY
列表中,以强制 Go 直接从 GitHub 下载该帮助程序。如果你还学习了
想要直接从来源下载的文件,可以添加文件,用英文逗号分隔
如以下示例中所示:
export GONOPROXY=MODULE_PATH1, MODULE_PATH2
其中,MODULE_PATH1 和 MODULE_PATH2 是从源代码下载的模块的模块路径。
如需将 Go 凭据帮助程序添加到 GONOPROXY
列表并运行它以设置凭据,请执行以下操作:
将 Go 凭据帮助程序添加到您的
GONOPROXY
export GONOPROXY=github.com/GoogleCloudPlatform/artifact-registry-go-tools
运行以下命令,将您的 Artifact Registry 凭据添加到 netrc 文件与 Go 模块包工具结合使用:
GOPROXY=proxy.golang.org \ go run github.com/GoogleCloudPlatform/artifact-registry-go-tools/cmd/auth@v0.1.0 \ add-locations --locations=LOCATION \ [--json_key=path/to/service/account/key.json]
其中 LOCATION 是代码库的单区域或多区域位置。要添加多个地理位置,请以逗号分隔 分隔列表。
Go 凭据帮助程序会向您的 netrc 文件添加设置,以便对 Artifact Registry 进行身份验证。如果您传递
--json_key
标志,则系统会将键添加到 您的 netrc 文件,用于密码身份验证。
将模块用作依赖项
如果您使用短期有效凭据进行身份验证 到 Artifact Registry,您需要运行以下命令来刷新 OAuth 令牌 以下命令:
GOPROXY=proxy.golang.org \ go run github.com/GoogleCloudPlatform/artifact-registry-go-tools/cmd/auth@v0.1.0 refresh
在您的主目录中,创建一个名为“bar”的目录
mkdir bar
切换到模块的目录,然后运行
go mod init
以为软件包创建go.mod
文件。cd bar \ go mod init example.com/bar
将
example.com/bar
替换为模块路径。请参阅 Go 模块参考文档 。如需要求存储在 Artifact Registry 中的 foo 版本,请将
go.mod
文件修改为如下所示:module example.com/bar go 1.19 require example.com/foo v0.1.0
替换以下内容:
example.com/foo
是必需模块的模块路径v0.1.0
是存储在 Artifact Registry 中的版本
在
bar
目录中创建一个main.go
文件,其中包含以下内容:package main import ( "fmt" foo "example.com/foo" ) func main() { fmt.Println(foo.HelloWorld) }
运行 go mod tidy 以下载依赖项,包括 foo 软件包:
go mod tidy
运行 bar 模块:
go run .
输出类似以下内容:
Hello World!
清理
为避免因本页中使用的资源导致您的 Google Cloud 账号产生费用,请按照以下步骤操作。
为避免系统因资源向您的 Google Cloud 账号收取费用 请按照以下步骤操作。在移除代码库之前,请确保 您要保留的所有模块都可以在其他位置使用。
如需删除代码库,请执行以下操作:
gcloud artifacts repositories delete \ --location=LOCATION \ --project=PROJECT \ REPOSITORY
替换以下内容:
如果您想移除自己的默认代码库和 ,请运行以下命令:
gcloud config unset artifacts/repository gcloud config unset artifacts/location
后续步骤
- 详细了解如何配置身份验证。
- 了解如何管理代码库。
- 了解如何管理 Go 模块。
- 阅读我们关于 DevOps 的资源,并探索 DevOps 研究和评估研究项目。