npm 发布因 GitLab NPM 注册表而失败

Posted

技术标签:

【中文标题】npm 发布因 GitLab NPM 注册表而失败【英文标题】:npm publish fails with GitLab NPM registry 【发布时间】:2021-05-15 03:04:30 【问题描述】:

我尝试使用新的 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 的关键内容(我在这段摘录中省略了contributorsdependenciesdevDependenciesengineauthor):


  "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/"
  

我还按照this official guide 尝试了几个不同的包名称,但无济于事。

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

注意:我已经替换了所有中提到的端点的 FQDN,以防我的雇主对此发脾气。

【问题讨论】:

【参考方案1】:

在这种情况下,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

【讨论】:

作为旁注,403s 可以反过来引用“您可能不会发布具有此版本的包”(以解决您的 package.json/npm version minor 中的版本碰撞问题)。 404 和 403 在上下文中都有意义,但不直观。 谢谢您,先生和学者!我不知道这可能是罪魁祸首,但事实证明你是对的。如果我放弃https,它确实有效。 谢谢。我在路径中使用的是“项目 slug”而不是数字项目 ID!【参考方案2】:

就我而言,我遇到了类似的问题,这个问题帮助我理解了问题。

检查package.jsonpublishConfig 设置。如问题所示,格式为@company:registy。起初我误解了,我认为“注册表”是它的名字。但它的字面意思是“注册表”。

希望对某人有所帮助!

【讨论】:

以上是关于npm 发布因 GitLab NPM 注册表而失败的主要内容,如果未能解决你的问题,请参考以下文章

从私有 gitlab 注册表安装多个 npm 包

npm install loom-truffle-provider 因 node-gyp 与 scrypt 不兼容而失败

Gitlab CI 失败:未找到 NPM 命令

在 Gitlab 中使用 NPM 发布

npm install 失败,因为注册表中缺少包

npm install 后 Gitlab Shared Runner docker build