在 Artifact Registry 中存储 Go 模块

设置私有 Artifact Registry Go 代码库,向其中上传模块,并将该模块用作依赖项。

准备工作

  1. 登录您的 Google 账号。

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

  2. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

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

  4. 启用 Artifact Registry API。

    启用 API

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

    gcloud init
  7. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  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 是代码库的单区域或多区域位置。如果设置了默认值,则可以省略此标志。 如需查看受支持位置的列表,请运行命令 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 模块代理)下载模块,然后下载源代码:

      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 进行身份验证

从 Artifact Registry 下载打包的 Go 模块以用作依赖项时,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 列表并运行它以设置凭据,请执行以下操作:

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

      export GONOPROXY=github.com/GoogleCloudPlatform/artifact-registry-go-tools
    
  2. 运行以下命令,使用 Go 模块软件包工具将 Artifact Registry 凭据添加到 netrc 文件中:

      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 凭据帮助程序会将用于向 Artifact Registry 进行身份验证的设置添加到 netrc 文件中。如果您传递 --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. 运行酒吧模块:

      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 配置配置的默认代码库和位置设置,请运行以下命令:

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

后续步骤