将 Go 模块存储在 Artifact Registry 中

设置私有 Artifact Registry Go 代码库,上传模块 然后将该模块用作依赖项。

准备工作

  1. 登录您的 Google 账号。

    如果您还没有 Google 账号,请注册新账号

  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. 确保您的 Google Cloud 项目已启用结算功能

  4. 启用 Artifact Registry API。

    启用 API

  5. 安装 Google Cloud CLI。
  6. 如需初始化 gcloud CLI,请运行以下命令:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  8. 确保您的 Google Cloud 项目已启用结算功能

  9. 启用 Artifact Registry API。

    启用 API

  10. 安装 Google Cloud CLI。
  11. 如需初始化 gcloud CLI,请运行以下命令:

    gcloud init
  12. 安装 Go 1.15 或更高版本。
  13. 安装 package-go-module gcloud CLI 插件:
    gcloud components install package-go-module

创建代码库

如需创建和配置新代码库,请执行以下操作:

  1. 运行以下命令创建新代码库。

    gcloud artifacts repositories create REPOSITORY \
        --repository-format=go \
        --location=LOCATION \
        --description=DESCRIPTION
    

    替换以下内容:

    • REPOSITORY 是代码库的名称。对于项目中的每个代码库位置,代码库名称不得重复。
    • LOCATION 是单区域级或多区域级 位置 代码库如果您设置了一个 default。 如需查看受支持位置的列表,请运行以下命令: gcloud artifacts locations list.
    • DESCRIPTION 是代码库的可选说明。错误做法 包含敏感数据,因为仓库说明未加密。
  2. 运行以下命令以查看代码库详细信息。

      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 模块。

  1. 在主目录中,创建一个名为“foo”的目录。适合你的模块

    mkdir foo
    
  2. 将目录更改为模块的目录,然后运行 go mod init 以创建 模块的 go.mod 文件

      cd foo \
      go mod init example.com/foo
    

    example.com/foo 替换为模块路径。请参阅 Go 模块参考文档

  3. 在 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 环境

  1. 指示 Go 从 Artifact Registry(公共 Go)下载模块 模块代理,然后是 source,顺序如下:

      export GOPROXY=https://LOCATION-go.pkg.dev/PROJECT/REPOSITORY,https://proxy.golang.org,direct
    

    替换以下内容:

    • LOCATION 是单区域级或多区域级 位置 代码库的位置
    • PROJECT 是您的 Google Cloud 项目 ID
    • REPOSITORY 是存储 文件包。
  2. 使用公共校验和数据库排除您的模块:

      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 命令将读取 $HOME/.netrc(在类似 UNIX 的平台上)或 %USERPROFILE%\_netrc(在 Windows 上)。

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 列表并运行它以设置您的 凭据:

  1. 将 Go 凭据帮助程序添加到您的 GONOPROXY

      export GONOPROXY=github.com/GoogleCloudPlatform/artifact-registry-go-tools
    
  2. 运行以下命令,将您的 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 是单区域级或多区域级 位置 创建 Deployment 清单要添加多个地理位置,请以逗号分隔 分隔列表。

    Go 凭据帮助程序会将身份验证设置添加到您的 netrc 文件中 复制到 Artifact Registry如果您传递 --json_key 标志,则系统会将键添加到 您的 netrc 文件,用于密码身份验证。

将模块用作依赖项

  1. 如果您使用短期有效凭据进行身份验证 到 Artifact Registry,您需要运行以下命令来刷新 OAuth 令牌 以下命令:

      GOPROXY=proxy.golang.org \
      go run github.com/GoogleCloudPlatform/artifact-registry-go-tools/cmd/auth@v0.1.0 refresh
    
  2. 在您的主目录中,创建一个名为“bar”的目录

      mkdir bar
    
  3. 将目录更改为模块的目录,然后运行 go mod init 以创建 为软件包创建 go.mod 文件。

      cd bar \
      go mod init example.com/bar
    

    example.com/bar 替换为模块路径。请参阅 Go 模块参考文档

  4. 如需要求使用 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 中的版本
  5. 在您的 bar 目录中创建一个 main.go 文件,其中包含以下代码 内容:

      
      package main
    
      import (
        "fmt"
    
        foo "example.com/foo"
      )
    
      func main() {
        fmt.Println(foo.HelloWorld)
      }
    
      
    
  6. 运行 go mod tidy 以下载依赖项,包括 foo 软件包:

      go mod tidy
    
  7. 运行 bar 模块:

      go run .
    

    输出类似以下内容:

      Hello World!
    

清理

为避免因本页中使用的资源导致您的 Google Cloud 账号产生费用,请按照以下步骤操作。

为避免系统因资源向您的 Google Cloud 账号收取费用 请按照以下步骤操作。在移除代码库之前,请确保 您要保留的所有模块都可以在其他位置使用。

  1. 如需删除代码库,请执行以下操作:

      gcloud artifacts repositories delete \
          --location=LOCATION \
          --project=PROJECT \
          REPOSITORY
    

    替换以下内容:

    • LOCATION 替换为单区域级或多区域级 位置 代码库的位置
    • PROJECT 替换为 Google Cloud 项目 ID
    • REPOSITORY 替换为代码库的名称。
  2. 如果您想移除自己的默认代码库和 ,请运行以下命令:

      gcloud config unset artifacts/repository
      gcloud config unset artifacts/location
    

后续步骤