如何将软件包发布到 GitHub 软件包注册表

2025-06-09

如何将软件包发布到 GitHub 软件包注册表

如果您足够幸运,能够获得本周GitHub Package Registry的一批 beta 邀请,您可能想知道如何开始在那里发布您的 npm 包。

官方文档解释基础知识方面做得还不错,但并不像你想象的那么直白。而且有些地方,它们甚至自相矛盾。毕竟这只是一个测试版本,我相信随着这项新功能的发布,GitHub 会改进文档。

在本文中,我将逐步解释如何在 GitHub 包注册表(从现在开始我将其称为 GPR)上发布您的第一个包。然后,我将简要解释您的用户如何从 GPR 安装包,同时仍然能够从“正常”npmjs.org 注册表安装包。

请记住,GPR 仍处于测试阶段,因此实现细节可能会有所变更。希望我会记得更新本文,但如果有疑问,最好查阅官方文档。如果您发现任何过时的内容,请在评论中告诉我!

术语

GitHub 软件包中使用的术语与 npm 仓库中的术语基本相同。如果您已经熟悉这些术语,可以直接跳到下一节

注册表
为了按名称和版本解析软件包,npm(CLI 工具)会与注册中心网站进行通信。最受欢迎的注册中心由 npm(公司)托管在registry.npmjs.org上。
GitHub 包注册表 (GPR)
GitHub 最近宣布了他们自己的注册服务,可在npm.pkg.github.com上使用。该服务将与他们的其他产品紧密结合,因此您可以期待您的软件包能够与 GitHub 上的项目主页以及 GitHub Actions 完美集成。
范围
作用域是一种将相关软件包分组的方式。无论是在 npm 仓库还是 GPR 上,每个用户和组织都有各自的作用域。虽然在 npm 仓库中使用作用域是可选的,但发布到 GPR 的每个软件包都必须有作用域。

授权 npm

每台机器和每个 GitHub 用户/组织只需执行一次这些步骤。除非您想从新设备或新范围发布,否则无需重复执行这些步骤。

  1. 为要发布软件包的帐户创建一个新的个人访问令牌read:packages。该令牌应具有访问权限和write:packages范围。
    如果您要发布的仓库是私有的,则令牌还需要相应的repo权限。

  2. .npmrc在您的主目录中创建或编辑文件 ( ~/.npmrc) 并添加以下行,替换TOKEN为上面创建的个人访问令牌:

    //npm.pkg.github.com/:_authToken=TOKEN
    

设置你的包

每个包都必须明确指定发布到 GPR。否则,npm 将回退到 npm 注册表。

  1. .npmrc在项目根目录中创建或编辑该文件。添加以下行并替换OWNER为要发布到的 GitHub 用户或组织的用户名(即范围):

    @OWNER:registry=https://npm.pkg.github.com
    

    (这@是配置语法的一部分,不应被替换。)

  2. 确保您的package.json配置正确:

    包名称应以范围为前缀。PACKAGE这是您的包的实际名称。(再次,保留@):

    {
      "name": "@OWNER/PACKAGE"
    }
    

    repository字段应指向您正在发布的 GitHub 存储库:

    {
      "repository": "https://github.com/OWNER/REPO"
    }
    

    也可以通过仅更改包名称但保持字段指向repository同一个 repo 来为每个 repo 发布多个包。

发布!

剩下要做的就是为该包创建一个 GitHub 仓库(如果还没有),推送新的更改,然后运行npm publish!(据我所知,Yarn 目前不支持发布到 npm 以外的仓库。)如果一切顺利,你应该会看到你的包的第一个版本发布在https://github.com/OWNER/REPO/packages上(可以看看我自己的一个包作为示例。)

使用 GPR 包

现在您已将包发布到 GPR,您或其他人可能希望将其用作另一个项目的依赖项。为此,您需要再次将相关的 GPR URL 添加到项目的.npmrc

@OWNER:registry=https://npm.pkg.github.com
Enter fullscreen mode Exit fullscreen mode

需要注意的一点是,您需要对要使用的每个不同的GPR示波器重复此过程。因此,如果您要安装软件包@facebook/react,,,则应如下所示:@facebook/react-dom@webpack/webpack@babel/core.npmrc

@facebook:registry=https://npm.pkg.github.com
@webpack:registry=https://npm.pkg.github.com
@babel:registry=https://npm.pkg.github.com
Enter fullscreen mode Exit fullscreen mode

这些只是为了演示目的,在撰写本文时,这些组织都尚未向 GPR 发布任何软件包。

不过,好处是,无需任何额外配置,你就可以同时从 npm 仓库安装任何包。所以,如果你使用npm install lodash上述配置,它仍然可以从 npm 仓库解析 lodash。但要注意,如果你要安装的包与 GPR 包属于同一用户,则无法同时@foo/bar从 npm 仓库和@foo/bazGPR 安装。

交叉出版

如果你想开始发布到 GPR,但又不想强迫用户切换仓库,可以很容易地设置一种“混合”方法,同时发布到 GPR 和 npm 仓库。只需像这样设置一个postpublish脚本package.json

{
  "scripts": {
    "postpublish": "npm publish --ignore-scripts --@OWNER:registry='https://registry.npmjs.org'"
  }
}
Enter fullscreen mode Exit fullscreen mode

请注意--ignore-scripts阻止postpublish脚本再次调用自身的标志。

总结

如您所见,从/向 GPR 发布和使用软件包并非易事。GitHub 和 npm/yarn 开发人员都需要付出一些努力来使这一体验更加流畅,尤其是对于软件包使用者而言。话虽如此,拥有一个 npm 仓库的有力竞争对手还是很棒的,而且 GitHub 界面和 Actions 的集成看起来已经非常实用了。我以后肯定会将我的软件包交叉发布到 GitHub,并尽可能从那里安装。

Unsplashchuttersnap封面

鏂囩珷鏉ユ簮锛�https://dev.to/jgierer12/how-to-publish-packages-to-the-github-package-repository-4bai
PREV
CSS 动画指南 - 第 2 部分 animation-iteration-count animation-timing-function animation-play-state animation-delay animation-fill-mode animation-direction animation 简写 这就是第 2 部分的内容!🎉
NEXT
理解高阶函数