跳至主要内容

使用 RubyGems 注册表

您可以配置 RubyGems 将软件包发布到 GitHub Packages,并在使用 Bundler 的 Ruby 项目中将存储在 GitHub Packages 上的软件包作为依赖项使用。

先决条件

  • 您必须使用 RubyGems 2.4.1 或更高版本。要检查您的 RubyGems 版本,请

    gem --version
    
  • 您必须使用 bundler 1.6.4 或更高版本。要检查您的 Bundler 版本,请

    $ bundle --version
    Bundler version 1.13.7
    

对 GitHub Packages 进行身份验证

注意

GitHub Packages 仅支持使用个人访问令牌(经典版)进行身份验证。欲了解更多信息,请参阅 管理您的个人访问令牌

您需要访问令牌才能发布、安装和删除私有、内部以及公共软件包。

您可以使用个人访问令牌(经典版)对 GitHub Packages 或 GitHub API 进行身份验证。创建个人访问令牌(经典版)时,可根据需要为令牌分配不同的范围。有关个人访问令牌(经典版)的软件包相关范围的更多信息,请参阅 GitHub Packages 权限概述

要在 GitHub Actions 工作流中对 GitHub Packages 注册表进行身份验证,您可以使用

  • GITHUB_TOKEN 来发布与工作流仓库关联的软件包。
  • 使用至少具备 read:packages 范围的个人访问令牌(经典版)来安装与其他私有仓库关联的软件包(如果仓库被授予读取软件包的权限,也可以使用 GITHUB_TOKEN。参见 配置软件包的访问控制和可见性)。

在 GitHub Actions 工作流中进行身份验证

此注册表支持细粒度权限。对于支持细粒度权限的注册表,如果您的 GitHub Actions 工作流使用个人访问令牌对注册表进行身份验证,我们强烈建议您将工作流更新为使用 GITHUB_TOKEN。有关使用个人访问令牌对注册表进行身份验证的工作流更新指南,请参阅 使用 GitHub Actions 发布和安装软件包

注意

GitHub Actions 工作流使用 REST API 删除和恢复软件包的功能目前处于公开预览阶段,可能会有变更。

您可以在 GitHub Actions 工作流中使用 GITHUB_TOKEN 删除或恢复软件包(通过 REST API),前提是该令牌对软件包拥有 admin 权限。使用工作流发布软件包的仓库,以及您已显式连接到软件包的仓库,都会自动获得该仓库中软件包的 admin 权限。

有关 GITHUB_TOKEN 的更多信息,请参阅 在工作流中使用 GITHUB_TOKEN 进行身份验证。有关在 Actions 中使用注册表的最佳实践,请参阅 安全使用参考

您还可以为 GitHub Codespaces 和 GitHub Actions 分别独立设置软件包的访问权限。有关详细信息,请参阅 配置软件包的访问控制和可见性配置软件包的访问控制和可见性

使用个人访问令牌进行身份验证

您必须使用具备相应范围的个人访问令牌(经典版)来在 GitHub Packages 中发布和安装软件包。更多信息请参阅 GitHub Packages 入门

要发布和安装 gem,您可以配置 RubyGems 或 Bundler 使用个人访问令牌对 GitHub Packages 进行身份验证。

要发布新 gem,您需要通过编辑 ~/.gem/credentials 文件并加入您的个人访问令牌(classic)来对 RubyGems 进行 GitHub Packages 身份验证。如果该文件不存在,请创建一个新的 ~/.gem/credentials 文件。

例如,您可以创建或编辑 ~/.gem/credentials,加入以下内容,将 TOKEN 替换为您的个人访问令牌。

---
:github: Bearer TOKEN

要安装 gem,您需要通过更新 gem 源以包含 https://USERNAME:TOKEN@rubygems.pkg.github.com/NAMESPACE/ 来对 GitHub Packages 进行身份验证。您必须将

  • USERNAME 替换为您的 GitHub 用户名。
  • TOKEN 替换为您的个人访问令牌(classic)。
  • NAMESPACE 替换为 gem 所属的个人账户或组织的名称。

如果希望您的软件包可全局使用,可以运行以下命令将您的注册表添加为源。

gem sources --add https://USERNAME:TOKEN@rubygems.pkg.github.com/NAMESPACE/

要使用 Bundler 进行身份验证,请配置 Bundler 使用您的个人访问令牌(classic),将 USERNAME 替换为您的 GitHub 用户名,TOKEN 替换为您的个人访问令牌,NAMESPACE 替换为 gem 所属的个人账户或组织的名称。

bundle config https://rubygems.pkg.github.com/NAMESPACE USERNAME:TOKEN

发布软件包

首次发布软件包时,默认可见性为私有。要更改可见性或设置访问权限,请参阅 配置软件包的访问控制和可见性。有关创建 gem 的更多信息,请参阅 RubyGems 文档中的 Make your own gem

注意

如果您发布的软件包已链接到仓库,软件包会自动继承该仓库的访问权限,并且链接仓库中的 GitHub Actions 工作流也会自动获得对该软件包的访问权限,除非您的组织已禁用访问权限的自动继承。更多信息,请参阅 配置软件包的访问控制和可见性

  1. 对 GitHub Packages 进行身份验证。更多信息请参阅 对 GitHub Packages 进行身份验证

  2. gemspec 构建软件包以生成 .gem 包。将 GEM_NAME 替换为您的 gem 名称。

    gem build GEM_NAME.gemspec
    
  3. 将软件包发布到 GitHub Packages,需将 NAMESPACE 替换为软件包所属的个人账户或组织的名称,并将 GEM_NAME 替换为您的 gem 包名称。

    注意

    gem 的 metadata.gz 文件的最大未压缩尺寸必须小于 2 MB。超过此限制的推送请求将失败。

    $ gem push --key github \
    --host https://rubygems.pkg.github.com/NAMESPACE \
    GEM_NAME-0.0.1.gem
    

将软件包连接到仓库

RubyGems 注册表在您的组织或个人账户内存储软件包,并允许您将软件包关联到仓库。您可以选择继承仓库的权限,或独立于仓库设置细粒度权限。

通过在 gem.metadata 中的 github_repo 字段填写 GitHub 仓库的 URL,您可以确保 gem 在发布后立即链接到该仓库。一个仓库可以链接多个 gem。

gem.metadata = { "github_repo" => "ssh://github.com/OWNER/REPOSITORY" }

有关将已发布软件包与仓库关联的信息,请参阅 将仓库连接到软件包

安装软件包

您可以像使用 rubygems.org 上的 gem 那样使用 GitHub Packages 上的 gem。您需要通过在 ~/.gemrc 文件中将您的 GitHub 用户或组织添加为源,或使用 Bundler 并编辑 Gemfile 来对 GitHub Packages 进行身份验证。

  1. 对 GitHub Packages 进行身份验证。更多信息请参阅 对 GitHub Packages 进行身份验证

  2. 对于 Bundler,请在 Gemfile 中将您的 GitHub 用户或组织添加为源,以从此新源获取 gem。例如,您可以在 Gemfile 中添加一个新的 source 块,仅对您指定的包使用 GitHub Packages,将 GEM_NAME 替换为您想从 GitHub Packages 安装的包名称,将 NAMESPACE 替换为该 gem 所属的个人账户或组织的名称。

    source "https://rubygems.org.cn"
    
    gem "rails"
    
    source "https://rubygems.pkg.github.com/NAMESPACE" do
      gem "GEM_NAME"
    end
    
  3. 对于早于 1.7.0 的 Bundler 版本,您需要添加一个全局的 source。有关使用 Bundler 的更多信息,请参阅 bundler.io 文档

    source "https://rubygems.pkg.github.com/NAMESPACE"
    source "https://rubygems.org.cn"
    
    gem "rails"
    gem "GEM_NAME"
    
  4. 安装软件包

    gem install GEM_NAME --version "0.1.1"
    

延伸阅读

© . This site is unofficial and not affiliated with GitHub, Inc.