Skip to main content
我们经常发布文档更新,此页面的翻译可能仍在进行中。 有关最新信息,请访问英语文档

使用 RubyGems 注册表

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

注意:这种包类型可能不适用于你的实例,因为站点管理员可以启用或禁用每种支持的包类型。 有关详细信息,请参阅“为企业配置包支持”。

先决条件

  • 您必须具有 RubyGems 2.4.1 或更高版本。 要查找您的 RubyGems 版本:

    $ gem --version
  • 必须拥有 bundler 1.6.4 或更高版本。 要查找您的 Bundler 版本:

    $ bundle --version
    Bundler version 1.13.7

向 GitHub Packages 验证

需要访问令牌才能发布、安装和删除专用、内部和公共包。

可使用 personal access token 向 GitHub Packages 或 GitHub Enterprise Server API 进行身份验证。 创建 personal access token 时,可根据需要为令牌分配不同的作用域。 有关 personal access token 的包相关范围的详细信息,请参阅“关于 GitHub Packages 的权限”。

要在 GitHub Actions 工作流程内向 GitHub Packages 注册表验证,您可以使用:

  • GITHUB_TOKEN 发布与工作流存储库相关联的包。
  • 范围至少为 read:packages 的 personal access token,用于安装与其他专用存储库(GITHUB_TOKEN 无法访问)关联的包。

使用 personal access token 进行身份验证

必须使用具有适当范围的 personal access token 才可在 GitHub Packages 中发布和安装包。 有关详细信息,请参阅“关于 GitHub Packages”。

要发布和安装 gem,可以将 RubyGems 或 Bundler 配置为使用 personal access token 向 GitHub Packages 进行身份验证。

要发布新的 gem,需要通过编辑 ~/.gem/credentials 文件以包含你的 personal access token,使用 RubyGems 向 GitHub Packages 进行身份验证。 如果此文件不存在,请创建新的 ~/.gem/credentials 文件。

例如,创建或编辑 ~/.gem/credentials 以包含以下内容,将 TOKEN 替换为 personal access token 。

---
:github: Bearer TOKEN

要安装 gem,需要通过更新 gem 资源以包含 https://USERNAME:TOKEN@REGISTRY-URL/OWNER/,来向 GitHub Packages 进行身份验证。 必须:

  • USERNAME 替换为 GitHub 用户名。
  • TOKEN 替换为 personal access token。
  • OWNER 替换为拥有项目所在存储库的用户或组织帐户的名称。
  • REGISTRY-URL 替换为实例的 Rubygems 注册表的 URL。 如果实例启用了子域隔离功能,请使用 rubygems.HOSTNAME。 如果实例禁用了子域隔离功能,请使用 HOSTNAME/_registry/rubygems。 在任一情况下,都将 HOSTNAME 替换为 GitHub Enterprise Server 实例的主机名。

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

gem sources --add https://USERNAME:TOKEN@REGISTRY-URL/OWNER/

若要使用 Bundler 进行身份验证,请将 Bundler 配置为使用 personal access token,将 USERNAME 替换为 GitHub 用户名,将 TOKEN 替换为 personal access token,并将 OWNER 替换为拥有包含项目的存储库的用户或组织帐户的名称。将 REGISTRY-URL 替换为实例的 RubyGems 注册表的 URL 。 如果你的实例启用了子域隔离功能,请使用 rubygems.HOSTNAME。 如果实例禁用了子域隔离功能,请使用 HOSTNAME/_registry/rubygems。 在任一情况下,请将“主机名”替换为 GitHub Enterprise Server 实例的主机名。

$ bundle config https://REGISTRY-URL/OWNER USERNAME:TOKEN

发布包

默认情况下,GitHub 将包发布到与包同名的现有存储库中。 例如,将 <GEM NAME> 发布到 octo-org 组织时,GitHub Packages 会将 gem 发布到 octo-org/<GEM NAME> 存储库。有关创建 gem 的详细信息,请参阅 RubyGems 文档中的“创建自己的 gem”。

  1. 向 GitHub Packages 验证。 有关详细信息,请参阅“向 GitHub Packages 进行身份验证”。

  2. 从 gemspec 生成包以创建 .gem 包 。

    gem build <GEM NAME>.gemspec
    
  3. 将包发布到 GitHub Packages,将 OWNER 替换为的名称,并将 <GEM NAME> 替换为 gem 包的名称。 将 REGISTRY-URL 替换为实例的 Rubygems 注册表的 URL。 如果你的实例启用了子域隔离功能,请使用 rubygems.HOSTNAME。 如果实例禁用了子域隔离功能,请使用 HOSTNAME/_registry/rubygems。 在任一情况下,请将“主机名”替换为 GitHub Enterprise Server 实例的主机名。

    $ gem push --key github \
    --host https://REGISTRY-URL/OWNER \
    <GEM NAME>-0.0.1.gem
    

将多个包发布到同一个仓库

要将多个 gem 发布到同一存储库,可在 gem.metadatagithub_repo 字段中包含指向 GitHub 存储库的 URL。 如果包含此字段,则 GitHub 将基于此值匹配存储库,而不是使用 gem 名称。将 HOSTNAME 替换为 你的 GitHub Enterprise Server 实例 的主机名。

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

安装包

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

  1. 向 GitHub Packages 验证。 有关详细信息,请参阅“向 GitHub Packages 进行身份验证”。

  2. 对于 Bundler,请将 GitHub 用户或组织添加为 Gemfile 中的源,以便从这个新源获取 gem。 例如,可以将一个新的 source 块添加到 Gemfile,其仅对指定的包使用 GitHub Packages,将 GEM NAME 替换为要从 GitHub Packages 安装的包,并将“所有者”替换为拥有包含要安装的 gem 的存储库的用户或组织。 将 REGISTRY-URL 替换为实例的 Rubygems 注册表的 URL 。 如果你的实例启用了子域隔离功能,请使用 rubygems.HOSTNAME。 如果实例禁用了子域隔离功能,请使用 HOSTNAME/_registry/rubygems。 在任一情况下,请将“主机名”替换为 GitHub Enterprise Server 实例的主机名。

    source "https://rubygems.org"
    
    gem "rails"
    
    source "https://REGISTRY-URL/OWNER" do
      gem "GEM NAME"
    end
    
  3. 对于低于 1.7.0 的 Bundler 版本,需要添加新的全局 source。 有关使用 Bundler 的详细信息,请参阅 bundler.io 文档

    source "https://REGISTRY-URL/OWNER"
    source "https://rubygems.org"
    
    gem "rails"
    gem "GEM NAME"
    
  4. 安装包:

    $ gem install <GEM NAME> --version "0.1.1"
    

延伸阅读