首页 > 解决方案 > npm 发布因 GitLab NPM 注册表而失败

问题描述

我尝试使用新的 NPM 注册表,它现在是免费 GitLab 版本的一部分。我正在尝试创建一个 NPM 包并将其发布到我们公司的 GitLab 实例上。尝试运行npm publish时,进程退出并出现错误:

npm ERR! code E404
npm ERR! 404 Not Found - PUT https://gitlab.myemployer.com/api/v4/projects/1873/packages/npm/@sqt-klu%2fodysseus-nn-core
npm ERR! 404
npm ERR! 404  '@sqt-klu/odysseus-nn-core@0.0.1' is not in the npm registry.
npm ERR! 404 You should bug the author to publish it (or use the name yourself!)
npm ERR! 404
npm ERR! 404 Note that you can also install from a
npm ERR! 404 tarball, folder, http url, or git url.

通过 GitLab CI/CD 以及通过本地命令行运行时会出现此问题。

作为参考,我们内部 GitLab 的 URL 是 gitlab.myemployer.com/sqt-klu/odysseus/nn-core。因此,我认为@sqt-klu这是 GitLab 想要的范围。

CI/CD 文件(以及我一直试图在本地复制的文件)在此npm publish阶段之前执行此操作before_script

    - npm config set @sqt-klu:registry https://gitlab.myemployer.com/api/v4/projects/${CI_PROJECT_ID}/packages/npm/
    - npm config set https://gitlab.myemployer.com/api/v4/projects/${CI_PROJECT_ID}/packages/npm/:_authToken ${CI_JOB_TOKEN}

在本地,我的用户级 npmrc 如下(实际令牌已删除,但它是已分配所有可能范围的个人访问令牌):

audit-level=high
python=c:\Python27\python.exe
https://gitlab.myemployer.com/api/v4/projects/1873/packages/npm/:_authToken=redacted
@sqt-klu:registry=https://gitlab.myemployer.com/api/v4/projects/1873/packages/npm/

如果它是相关的,这里是(package.json我省略了contributors,,,,和在这段摘录中)的关键内容:dependenciesdevDependenciesengineauthor

{
  "name": "@sqt-klu/odysseus-nn-core",
  "version": "0.0.1",
  "license": "UNLICENSED",
  "publishConfig": {
    "@sqt-klu:registry":"https://gitlab.myemployer.com/api/v4/projects/1873/packages/npm/"
  }
}

我还根据这个官方指南尝试了一些不同的包名称,但无济于事。

我觉得我错过了一些非常微不足道的东西,但我被困在了这一点上。任何有用的指示或想法表示赞赏。

注意:我已经替换了所有提及的端点的 FQDN,以防我的雇主对此感到不满。

标签: node.jsnpmgitlabgitlab-cinpm-publish

解决方案


在这种情况下,404 错误可能会令人困惑地指代凭据问题。

你应该更换

https://gitlab.myemployer.com/api/v4/projects/${CI_PROJECT_ID}/packages/npm/:_authToken

和:

//gitlab.myemployer.com/api/v4/projects/${CI_PROJECT_ID}/packages/npm/:_authToken

所有其他设置看起来都不错*并且应该可以工作。默认情况下,Gitlab 项目应该启用包存储库功能。您可以在项目设置中启用/禁用它。


* 您可以将个人访问令牌的范围缩小到api.
当/如果您使用项目级或组织/组级部署令牌时,它们只需要read_package_registry和/或write_package_registry.


推荐阅读