21

我正在尝试在 GPR(Github 包注册表)上上传一个包。我登录成功:

npm login --registry=https://npm.pkg.github.com

然后运行这些命令:

npm set registry https://npm.pkg.github.com/

npm publish

返回此错误:

npm ERR! 404 Not Found - PUT https://npm.pkg.github.com/package-name
npm ERR! 404 
npm ERR! 404  'package-name@version' is not in the npm registry.

似乎它试图在 npm 注册表而不是 github 包注册表上上传一个包。我应该如何解决这个问题?

4

4 回答 4

28

有两种方法可以解决这个问题:

  1. 在 中指定publishConfig选项package.json
"publishConfig": {
    "registry":"https://npm.pkg.github.com/@OWNER"
},
  1. 使用以下内容将文件添加.npmrc到您的项目中:
registry=https://npm.pkg.github.com/@OWNER

替换OWNER为 GitHub 上拥有您将发布包的存储库的用户或组织帐户的名称。

于 2019-09-17T09:37:16.500 回答
18

例如:

{
  "name": "@elvisjs/calling-elvis",
  "repository": {
    "type": "git",
    "url": "https://github.com/elvisjs/calling-elvis"
  },
  "publishConfig": {
    "registry": "https://npm.pkg.github.com/elvisjs"
  }
}

,namerepository/url必须publishConfig/registry匹配。

于 2020-04-03T22:02:27.677 回答
10

Github 包注册表期望 package.json 上的名称属性为“@{github username}/{package name} 例如:-

"name": "@pravanjan/local-time",
"publishConfig": { 
     "registry": "https://npm.pkg.github.com/" 
 },

如果 package.json 中没有设置“publishConfig”,我们可以直接在终端设置注册表参数

npm publish --registry=https://npm.pkg.github.com/ 

这对我有用

于 2020-05-26T13:02:26.577 回答
2

正如此处其他答案所暗示的那样,上述错误的根本原因是 GPR(与https://www.npmjs.com/不同)要求包具有范围。

但是,似乎所有其他建议的解决方案(更新package.json等)都不允许在没有范围的情况下继续将包发布到https://www.npmjs.com/ 。这是我的解决方案,它允许两者:

假如说:

  1. package.json包含没有范围的简单包名称,通常是在将公共包发布到https://www.npmjs.com/时的情况
  2. GitHub Workflow 使用 GitHub 的Node.js 包模板配置

publish-gpr在默认步骤之前向作业添加附加步骤run: npm ci,以便将当前存储库的所有者动态插入到包名称中package.json

- name: Insert repository owner as scope into package name
  run: |
    node <<EOF
    const fs = require('fs').promises;
    fs.readFile('package.json', 'utf8').then((data) => JSON.parse(data)).then((json) => {
        json.name = '@$(echo "$GITHUB_REPOSITORY" | sed 's/\/.\+//')/' + json.name;
        console.info('Package name changed to %s', json.name);
        return fs.writeFile('package.json', JSON.stringify(json), 'utf8');
    }).catch(error => {
        console.error(error);
        process.exit(1);
    });
    EOF
于 2020-06-24T22:35:04.357 回答