在 Artifact Registry 中存储 Go 模块

设置一个专用 Artifact Registry Go 代码库,将模块上传到该代码库,并将该模块用作依赖项。

准备工作

  1. Sign in to your Google Account.

    If you don't already have one, sign up for a new account.

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

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Artifact Registry API.

    Enable the API

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    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. Make sure that billing is enabled for your Google Cloud project.

  9. Enable the Artifact Registry API.

    Enable the API

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    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 凭据帮助程序会向您的 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 配置而配置的默认代码库和位置信息设置,请运行以下命令:

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

后续步骤