最近在做一个基于Nuxt的项目时,我需要将一些应用程序级的逻辑分离到一个单独的Nuxt模块中,这样就可以独立地管理它,并在其他应用程序中重用它。
这应该很简单,但我必须将包变为私有,这为新模块的开发提供了很大的方向。
在这篇文章中,我将讨论我在Github包注册表上以私有npm包的形式发布这个包时遇到的问题,以及如何在另一个项目中使用私有包。本文不介绍如何创建
我们首先将模块存储库设为私有。如果您的存储库已经是私有的,那么您可以跳过此步骤。
私有存储库将作为私有 npm 包发布。
使您的包私有化的第一步可能是使您的包的存储库私有化。
要将您的 Github 存储库设为私有,请单击“设置”选项卡,滚动到底部,然后单击“更改存储库可见性”。仅当您的存储库尚未私有时才执行此操作。
如果你最近经常使用 Github,你一定已经看到了关于密码被弃用以支持更安全的访问令牌的通知。Github 开始向自 2020 年底以来仍在使用用户名和密码的基本身份验证方法的人发送电子邮件。您可能一定见过其中一个看起来像这样:
2020 年 9 月 29 日 13:37 (UTC),您使用密码通过 GitHub API 使用python-requests/2.18.4:访问端点。使用 API 密码的基本身份验证已被弃用,并且很快将不再有效。有关建议的解决方法和删除日期的更多信息,请访问此站点。
在使用GitHub API或命令行时,Github 个人访问令牌 (PAT) 是使用密码对 GitHub 进行身份验证的替代方法。(Github 文档)
要生成新令牌,请转到您的开发人员设置页面并单击Generate a new token:
我们需要一个带有write:packages范围的令牌;我们将选择保留 30 天的默认到期日期:
Github 个人访问令牌页面
复制您的令牌并将其存储在安全的地方,因为我们将在本教程的其余部分使用它。如果你丢失了它,Github 将不会再向你展示它,所以你将不得不销毁它并创建一个新的:
要发布 npm 包,您需要通过 Github 包注册表对 npm 进行身份验证。有两种方法可以做到这一点:您可以使用.npmrc文件进行身份验证或使用命令行。在本教程中,我们将使用这两种方法;我们将使用命令行来创建我们的包,而在托管项目中使用我们的包时我们将使用.npmrc 。
使用命令行验证您的开发环境以连接注册表,这足以在您开发包时使用。尽管如此,在部署包以在生产环境中进行身份验证时,您仍需要.npmrc文件。我们将很快详细介绍。
为此,请运行以下命令,该命令将提示您使用您的用户名、电子邮件和密码进行响应(在此处使用您生成的令牌)。我们正在使用我们的 Github 帐户详细信息和我们在前面步骤中生成的令牌对 Github 包注册表进行身份验证。--scope 这里是 NPM v2 中引入的一组包的唯一标识符。
范围可以附加到注册表,因此在该范围下发布的每个包都假定相同的注册表,默认情况下 --scope 将假定官方 NPM 注册表。在我们的例子中,我们希望它是 Github 包注册表,因此在下面的命令中,我们提供了一个 --registry 标志来指向https://npm.pkg.github.com。
npm login --scope=@OWNER --registry=https://npm.pkg.github.com
此处的范围可能是您的 GitHub 用户名或您的 Github 组织的用户名;一旦你的包发布了,你的包的用户可以像这样安装它:npm install @scope/package.
运行上述命令后,您应该会看到消息:如果您的身份验证成功,则以 goodhands 身份登录到https://npm.pkg.github.com/上的 @goodhands 范围。
如果你做到了这一点,恭喜你!✨
现在,是时候发布我们的包了,我们将看看一些清单,以使这个过程尽可能顺利。
本教程不涉及创建 Node.js 包,因此我希望您在阅读本教程之前已经拥有一个包。
在设置我们的开发环境时,我们创建了一个范围并将其附加到注册表。现在,为了让您的包在发布后转到正确的位置,即https://npm.pkg.github.com/,您需要使用与您进行身份验证的范围相同的范围作为您的包名称:
{
"name": "@goodhands/private-module",
"version": "1.0.0",
"description": "An example package",
"main": "index.js",
...
由于我使用了@goodhands 范围进行身份验证,因此我必须将该名称添加到我的 package.json 中。
现在您应该保存更改、提交并推送到 Github。
根据semver.org的说法,常规项目中的版本控制可能并不需要对主要、次要或补丁更改给予太多关注。但是,由于我们发布的包将被其他应用程序使用和依赖,因此坚持正确的约定非常重要。
我发现对自动化这很有用的一个工具是标准版本包,它可以自动化版本控制以符合 semver 标准并基于Conventional Commits生成CHANGELOG.md。
为了帮助快速发布、标记和更新变更日志,我在 package.json 的脚本中附加了标准版本命令,以及 Git 和 npm 命令的混合:
"scripts": {
"release": "standard-version && git push --follow-tags && npm publish"
}
请记住:您必须先在项目中安装标准版本作为 devDependency,然后才能将其用作脚本。
要添加standard-version
到您的项目,只需npm install -D standard-version@latest
在项目的根目录中运行。
我们release
附加到以下代码的脚本:standard-version && git push --follow-tags && npm publish
将执行以下步骤:
该脚本的第一部分standard-version
将:
第二部分是您可能已经习惯git push –follow-tags
的常规部分,但该部分将确保它将所有新创建的标签推送到当前提交。git push
–follow-tags
我们脚本的最后一部分是npm publish
将您最新版本的软件包发布到注册表。
如果您的包已成功发布,您应该会在日志中看到类似的输出:
npm notice
npm notice package: @goodhands/[email protected]
npm notice === Tarball Contents ===
npm notice 38B index.js
npm notice 744B package.json
npm notice 307B CHANGELOG.md
npm notice === Tarball Details ===
npm notice name: @goodhands/private-module
npm notice version: 1.0.2
npm notice package size: 690 B
npm notice unpacked size: 1.1 kB
npm notice shasum: e5432314e2[...]55f01523183
npm notice integrity: sha512[...]qANw
npm notice total files: 3
npm notice
+ @goodhands/[email protected]
现在,如果您访问 Github 上的包存储库,您应该会看到您创建的标签以及包链接:
如果你点击你的包链接,你会发现关于你的包的更多细节,包括安装命令、总下载量、以前的版本等:
要在另一个项目中使用您的包,在安装包之前,您需要首先使用以下详细信息创建一个.npmrc文件:
@goodhands:registry=https://npm.pkg.github.com
//npm.pkg.github.com/:_authToken=${NPM_TOKEN}
同样,这里的@goodhands 是我们附加到 Github 包注册表的范围,而NPM_TOKEN是在另一个项目中使用您的包所需的令牌。NPM_TOKEN将存储在生产环境变量中,而在开发中,您希望将其存储在.bashrc文件或类似文件中,具体取决于您的操作系统;这样您就可以使用相同的令牌来验证多个项目,而无需在每个项目中都有一个.env文件。
发布个人包的流程与发布组织包的流程几乎没有区别。对于 NPM 私有包,唯一可以使用它们的人就是你。使用您在创建包时进行身份验证的相同令牌,您必须在您希望在其中使用包的任何项目中替换NPM_TOKEN。您可以通过.bashrc文件执行此操作。
对于组织包,这意味着您的 --scope 标志引用了 Github 上的组织,并且包的存储库也在同一个组织下,那么组织内有权访问存储库的每个软件开发人员都可以在另一个组织中使用该包项目。
就像任何其他 npm 包一样,您只需通过运行指向您的包名称和首选版本的命令来安装它:
npm install @goodhands/[email protected]
当使用您的包的项目托管在 Netlify 或 Heroku 等平台上时,您只需将NPM_TOKEN添加到环境变量中,使用您在创建包时用于身份验证的相同令牌。您将能够成功使用您的包。
也许创建私有包并使用 Github 注册中心发布的亮点主要是在我们在本文中完成的步骤中使用 NPM 进行身份验证时提供 Github 注册中心作为注册中心。
您必须确保您的存储库是私有的。一旦这样,它就会设置一个身份验证框架,您必须在其中使用从开发人员设置页面生成的令牌告诉 Github 您的身份,该令牌也必须具有packages
权限。
现在,对您组织中的其他开发人员进行身份验证(如果您作为组织创建包)就像邀请他们加入您的组织一样简单。然后他们还可以生成一个可以对他们进行身份验证的令牌。