{"meta":{"title":"在 npm 注册表上工作","intro":"你可以将 npm 配置为把包发布到 GitHub Packages，并在 npm 项目中将存储在 GitHub Packages 上的包用作依赖项。","product":"GitHub Packages","breadcrumbs":[{"href":"/zh/packages","title":"GitHub Packages"},{"href":"/zh/packages/working-with-a-github-packages-registry","title":"使用 GitHub Packages 注册表"},{"href":"/zh/packages/working-with-a-github-packages-registry/working-with-the-npm-registry","title":"npm 注册表"}],"documentType":"article"},"body":"# 在 npm 注册表上工作\n\n你可以将 npm 配置为把包发布到 GitHub Packages，并在 npm 项目中将存储在 GitHub Packages 上的包用作依赖项。\n\n<!-- 2148AF7B-5FF8-4B28-A808-D692FEE2225A -->\n\n## 正在对GitHub Packages进行身份验证\n\n> \\[!NOTE]\n> GitHub Packages 仅支持使用 personal access token (classic) 进行身份验证。 有关详细信息，请参阅“[管理个人访问令牌](/zh/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens)”。\n\n需要访问令牌才能发布、安装和删除专用、内部和公共包。\n\n你可以使用 personal access token (classic) 向 GitHub Packages 或 GitHub API 进行身份验证。 创建 personal access token (classic) 时，可根据需要为令牌分配不同的作用域。 有关 personal access token (classic) 的包相关作用域的详细信息，请参阅 [关于 GitHub Packages 的权限](/zh/packages/learn-github-packages/about-permissions-for-github-packages#about-scopes-and-permissions-for-package-registries)。\n\n要在 GitHub Packages 工作流程内向 GitHub Actions 注册表验证，您可以使用：\n\n* `GITHUB_TOKEN` 发布与工作流存储库相关联的包。\n* 范围至少为 `read:packages` 的 personal access token (classic)，用于安装与其他专用存储库关联的包（如果向存储库授予对包的读取访问权限，可以使用 `GITHUB_TOKEN`。 请参阅 [配置包的访问控制和可见性](/zh/packages/learn-github-packages/configuring-a-packages-access-control-and-visibility)）。\n\n### 在 GitHub Actions 工作流中进行身份验证\n\n此注册表支持精细权限。 对于支持细粒度权限的注册表，如果您的GitHub Actions工作流使用personal access token向注册表进行身份验证，我们强烈建议您更新工作流以使用`GITHUB_TOKEN`。 有关更新通过 personal access token 向注册表进行身份验证的工作流的指导，请参阅 [使用 GitHub Actions 发布和安装包](/zh/packages/managing-github-packages-using-github-actions-workflows/publishing-and-installing-a-package-with-github-actions#upgrading-a-workflow-that-accesses-a-registry-using-a-personal-access-token)。\n\n> \\[!NOTE]\n> GitHub Actions 工作流使用 REST API 删除和还原包的功能目前为 公开预览，可能随时更改。\n\n如果令牌对该包具有 `GITHUB_TOKEN` 权限，则可以在 GitHub Actions 工作流中使用 `admin` 通过 REST API 删除或恢复软件包。 通过工作流发布软件包的仓库，以及你已明确关联到软件包的仓库，会自动获得对该仓库中软件包的 `admin` 权限。\n\n有关 `GITHUB_TOKEN` 的详细信息，请参阅 [在工作流中使用 GITHUB\\_TOKEN 进行身份验证](/zh/actions/tutorials/authenticate-with-github_token#using-the-github_token-in-a-workflow)。 有关在操作中使用注册表时的最佳做法的详细信息，请参阅 [被入侵的运行器](/zh/actions/concepts/security/compromised-runners#cross-repository-access)。\n\n您还可以选择针对GitHub Codespaces和GitHub Actions分别为包授予访问权限。 有关详细信息，请参阅 [配置包的访问控制和可见性](/zh/packages/learn-github-packages/configuring-a-packages-access-control-and-visibility#ensuring-github-codespaces-access-to-your-package) 和 [配置包的访问控制和可见性](/zh/packages/learn-github-packages/configuring-a-packages-access-control-and-visibility#ensuring-workflow-access-to-your-package)。\n\n### 使用personal access token进行身份验证\n\n必须使用具有适当范围的 personal access token (classic) 才可在 GitHub Packages 中发布和安装包。 有关详细信息，请参阅“[GitHub Packages 简介](/zh/packages/learn-github-packages/introduction-to-github-packages#authenticating-to-github-packages)”。\n\n您可以通过 npm 向 GitHub Packages 进行身份验证：一种方式是编辑每个用户的 `~/.npmrc` 文件，使其包含您的 personal access token (classic)；另一种方式是在命令行中使用您的用户名和 personal access token 登录 npm。\n\n若要通过将你的 personal access token (classic) 添加到 `~/.npmrc` 文件中进行身份验证，请编辑项目的 `~/.npmrc` 文件，加入以下行，并将 TOKEN 替换为你的 personal access token。 如果 `~/.npmrc` 文件不存在，则创建一个新的。\n\n```shell\n//npm.pkg.github.com/:_authToken=TOKEN\n```\n\n若要通过登录到 npm 进行身份验证，请使用 `npm login` 命令，将 USERNAME 替换为 GitHub 用户名、令牌替换为电子邮件地址 personal access token (classic)，将 PUBLIC-EMAIL-ADDRESS 替换为电子邮件地址。\n\n如果使用 npm CLI 版本 9 或更高版本，并且使用命令行登录或注销专用注册表，则应使用 `--auth-type=legacy` 选项从提示中读取身份验证详细信息，而不是通过浏览器使用默认登录流。 有关详细信息，请参阅 [`npm-login`](https://docs.npmjs.com/cli/v10/commands/npm-login)。\n\n如果你在使用 npm 时并未将 GitHub Packages 设为默认包注册表，并且想要使用 `npm audit` 命令，我们建议你在向 `--scope` 进行身份验证时，将\n标志与托管该包的命名空间一起使用（该命名空间可以是包所属的个人帐户或组织 ）。\n\n```shell\n$ npm login --scope=@NAMESPACE --auth-type=legacy --registry=https://npm.pkg.github.com\n\n> Username: USERNAME\n> Password: TOKEN\n```\n\n## 发布包\n\n> \\[!NOTE]\n\n> * 包名称和作用域只能使用小写字母。\n> * npm 版本的 tarball 必须小于 256MB。\n\n注册表 GitHub Packages 将 npm 包存储在组织或个人帐户中，并允许将包与存储库相关联。 可以选择是从存储库继承权限，还是独立于存储库设置精细权限。\n\n首次发布包时，默认可见性是私有的。 若要更改可见性或设置访问权限，请参阅 [配置包的访问控制和可见性](/zh/packages/learn-github-packages/configuring-a-packages-access-control-and-visibility)。 有关将已发布的包与存储库链接的详细信息，请参阅 [将仓库连接到软件包](/zh/packages/learn-github-packages/connecting-a-repository-to-a-package)。\n\n一旦包发布，即可通过在 `repository` 文件中包含 `package.json` 字段来将包连接到存储库。 还可以使用此方法将多个包连接至同一个存储库。 有关详细信息，请参阅[将多个包发布到同一仓库](#publishing-multiple-packages-to-the-same-repository)。\n\n> \\[!NOTE]\n> 如果发布链接到存储库的包，该包会自动继承链接存储库的访问权限，链接存储库中的 GitHub Actions 工作流会自动获得对包的访问权限，除非你的组织已禁用访问权限的自动继承。 有关详细信息，请参阅“[配置包的访问控制和可见性](/zh/packages/learn-github-packages/configuring-a-packages-access-control-and-visibility#about-inheritance-of-access-permissions)”。\n\n可以使用项目中的本地 `.npmrc` 文件或使用 `publishConfig` 中的 `package.json` 选项来设置项目的作用域映射。\nGitHub Packages 仅支持带作用域的 npm 包。 作用域内包的名称格式为 `@NAMESPACE/PACKAGE-NAME`。 作用域内的包总是以 `@` 符号开头。 可能需要更新 `package.json` 中的名称以使用作用域内的名称。 例如，如果你是用户 `octocat`，包名为 `test`，则分配区分范围的包名称，如下所示：`\"name\": \"@octocat/test\"`。\n\n在发布包后，您可以在 GitHub 上查看该包。 有关详细信息，请参阅“[查看包](/zh/packages/learn-github-packages/viewing-packages)”。\n\n### 使用本地 `.npmrc` 文件来发布包\n\n可以使用 `.npmrc` 文件来配置项目的作用域映射。 在 `.npmrc` 文件中，使用 GitHub Packages URL 和帐户所有者，以便 GitHub Packages 知道在何处路由包请求。 使用 `.npmrc` 文件可防止其他开发人员意外将软件包发布到 npmjs.org，而不是 GitHub Packages。\n\n1. 向 GitHub Packages 验证。 有关详细信息，请参阅[向 GitHub Packages 进行身份验证](#authenticating-to-github-packages)。\n\n2. 在与 `package.json` 文件相同的目录中，创建或编辑 `.npmrc` 文件以包含指定 GitHub Packages URL 和托管包的命名空间的行。 将 `NAMESPACE` 替换为作为包限定范围的用户或组织帐户的名称。\n\n   ```shell\n   @NAMESPACE:registry=https://npm.pkg.github.com\n   ```\n\n3. 将 .npmrc 文件添加到 GitHub Packages 可在其中找到项目的存储库。 有关详细信息，请参阅“[添加文件到仓库](/zh/repositories/working-with-files/managing-files/adding-a-file-to-a-repository)”。\n\n4. 验证项目的 `package.json` 中包的名称。\n   `name` 字段必须包含包的作用域和名称。 例如，如果你的包名为“test”，并且你要将其发布到“My-org” GitHub 组织，那么你在 `name` 中的 `package.json` 字段应为 `@my-org/test`。\n\n5. 验证项目 `package.json` 中的 `repository` 字段。 `repository` 字段必须与 GitHub 存储库的 URL 匹配。 例如，如果存储库 URL 是 `github.com/my-org/test`，则存储库字段应为 `https://github.com/my-org/test.git`。\n\n6. 发布包：\n\n   ```shell\n   npm publish\n   ```\n\n### 使用 `publishConfig` 文件中的 `package.json` 发布包\n\n可以使用 `publishConfig` 文件中的 `package.json` 元素来指定要发布包的注册表。 有关详细信息，请参阅 npm 文档中的 [publishConfig](https://docs.npmjs.com/files/package.json#publishconfig)。\n\n1. 编辑您的程序包的 `package.json` 文件，并添加一个 `publishConfig` 条目。\n\n   ```shell\n   \"publishConfig\": {\n     \"registry\": \"https://npm.pkg.github.com\"\n   },\n   ```\n\n2. 验证项目 `package.json` 中的 `repository` 字段。 `repository` 字段必须与 GitHub 存储库的 URL 匹配。 例如，如果存储库 URL 是 `github.com/my-org/test`，则存储库字段应为 `https://github.com/my-org/test.git`。\n\n3. 发布包：\n\n   ```shell\n   npm publish\n   ```\n\n## 将多个包发布到同一个仓库\n\n若要发布多个包并将其链接到同一存储库，可以在每个包的文件字段中包含存储库GitHub的 `repository``package.json` URL。 有关详细信息，请参阅 npm 文档中的[创建 package.json 文件](https://docs.npmjs.com/creating-a-package-json-file)和[创建 Node.js 模块](https://docs.npmjs.com/creating-node-js-modules)。\n\n若要确保存储库的 URL 正确，请替换为 `REPOSITORY` 包含要发布的包的存储库的名称，以及 `OWNER` 拥有存储库的个人帐户或组织 GitHub 的名称。\n\nGitHub Packages 将基于 URL匹配存储库。\n\n```shell\n\"repository\":\"https://github.com/OWNER/REPOSITORY\",\n```\n\n## 安装软件包\n\n您可以通过将这些包作为依赖项添加到项目的 GitHub Packages 文件中，从 `package.json` 安装包。 有关在项目中使用 `package.json` 的详细信息，请参阅 npm 文档中的[使用 package.json](https://docs.npmjs.com/getting-started/using-a-package.json)。\n\n默认情况下，您可以从一个组织添加包。 有关详细信息，请参阅[从其他组织安装包](#installing-packages-from-other-organizations)。\n\n还需要将 `.npmrc` 文件添加到项目，以便安装包的所有请求都经过 GitHub Packages。 当您通过 GitHub Packages 路由所有软件包请求时，您可以同时使用来自 *npmjs.org* 的作用域包和非作用域包。有关详细信息，请参阅 npm 文档中的 [npm-scope](https://docs.npmjs.com/misc/scope)。\n\n1. 向 GitHub Packages 验证。 有关详细信息，请参阅[向 GitHub Packages 进行身份验证](#authenticating-to-github-packages)。\n\n2. 在与 `package.json` 文件相同的目录中，创建或编辑 `.npmrc` 文件以包含指定 GitHub Packages URL 和托管包的命名空间的行。 将 `NAMESPACE` 替换为作为包限定范围的用户或组织帐户的名称。\n\n   ```shell\n   @NAMESPACE:registry=https://npm.pkg.github.com\n   ```\n\n3. 将 .npmrc 文件添加到 GitHub Packages 可在其中找到项目的存储库。 有关详细信息，请参阅“[添加文件到仓库](/zh/repositories/working-with-files/managing-files/adding-a-file-to-a-repository)”。\n\n4. 在项目中配置 `package.json` 以使用要安装的包。 若要将依赖项添加到用于 `package.json` 的 GitHub Packages 文件中，请指定完整作用域包名，例如 `@my-org/server`。 对于来自 npmjs.com 的包，请指定全名，例如 \\_\\_ 或 `@babel/core`。 将 `ORGANIZATION_NAME/PACKAGE_NAME` 替换为包依赖项。\n\n   ```json\n   {\n     \"name\": \"@my-org/server\",\n     \"version\": \"1.0.0\",\n     \"description\": \"Server app that uses the ORGANIZATION_NAME/PACKAGE_NAME package\",\n     \"main\": \"index.js\",\n     \"author\": \"\",\n     \"license\": \"MIT\",\n     \"dependencies\": {\n       \"ORGANIZATION_NAME/PACKAGE_NAME\": \"1.0.0\"\n     }\n   }\n   ```\n\n5. 安装此包。\n\n   ```shell\n   npm install\n   ```\n\n### 从其他组织安装软件包\n\n默认情况下，只能从一个组织使用 GitHub Packages 包。 如果要将包请求路由到多个组织和用户，可以向 `.npmrc` 文件中添加其他行，并将 `NAMESPACE` 替换为拥有包含该项目的仓库且该包所属的个人帐户或组织的名称。\n\n```shell\n@NAMESPACE:registry=https://npm.pkg.github.com\n@NAMESPACE:registry=https://npm.pkg.github.com\n```"}