如何将软件包发布到 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 用户/组织只需执行一次这些步骤。除非您想从新设备或新范围发布,否则无需重复执行这些步骤。
-
为要发布软件包的帐户创建一个新的个人访问令牌
read:packages
。该令牌应具有访问权限和write:packages
范围。
如果您要发布的仓库是私有的,则令牌还需要相应的repo
权限。 -
.npmrc
在您的主目录中创建或编辑文件 (~/.npmrc
) 并添加以下行,替换TOKEN
为上面创建的个人访问令牌://npm.pkg.github.com/:_authToken=TOKEN
设置你的包
每个包都必须明确指定发布到 GPR。否则,npm 将回退到 npm 注册表。
-
.npmrc
在项目根目录中创建或编辑该文件。添加以下行并替换OWNER
为要发布到的 GitHub 用户或组织的用户名(即范围):@OWNER:registry=https://npm.pkg.github.com
(这
@
是配置语法的一部分,不应被替换。) -
确保您的
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
需要注意的一点是,您需要对要使用的每个不同的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
这些只是为了演示目的,在撰写本文时,这些组织都尚未向 GPR 发布任何软件包。
不过,好处是,无需任何额外配置,你就可以同时从 npm 仓库安装任何包。所以,如果你使用npm install lodash
上述配置,它仍然可以从 npm 仓库解析 lodash。但要注意,如果你要安装的包与 GPR 包属于同一用户,则无法同时@foo/bar
从 npm 仓库和@foo/baz
GPR 安装。
交叉出版
如果你想开始发布到 GPR,但又不想强迫用户切换仓库,可以很容易地设置一种“混合”方法,同时发布到 GPR 和 npm 仓库。只需像这样设置一个postpublish
脚本package.json
:
{
"scripts": {
"postpublish": "npm publish --ignore-scripts --@OWNER:registry='https://registry.npmjs.org'"
}
}
请注意--ignore-scripts
阻止postpublish
脚本再次调用自身的标志。
总结
如您所见,从/向 GPR 发布和使用软件包并非易事。GitHub 和 npm/yarn 开发人员都需要付出一些努力来使这一体验更加流畅,尤其是对于软件包使用者而言。话虽如此,拥有一个 npm 仓库的有力竞争对手还是很棒的,而且 GitHub 界面和 Actions 的集成看起来已经非常实用了。我以后肯定会将我的软件包交叉发布到 GitHub,并尽可能从那里安装。
鏂囩珷鏉ユ簮锛�https://dev.to/jgierer12/how-to-publish-packages-to-the-github-package-repository-4bai