Yarn 找不到私有的 Github npm 注册表

Posted

技术标签:

【中文标题】Yarn 找不到私有的 Github npm 注册表【英文标题】:Yarn can't find private Github npm registry 【发布时间】:2020-02-07 11:56:04 【问题描述】:

我注册了 Github 私有 npm 注册表测试版并按照他们的指示进行操作:https://github.com/features/package-registry

与 npm 配合得很好,但我更喜欢使用 yarn。虽然 npm 找到注册的包没有问题,但 yarn 根本找不到。

yarn add @omniphx/adminite-adminite-ui-components 输出:

yarn add v1.19.0
info No lockfile found.
warning package-lock.json found. Your project contains lock files generated by tools other than Yarn. It is advised not to mix package managers in order to avoid resolution inconsistencies caused by unsynchronized lock files. To clear this warning, remove package-lock.json.
[1/4] ????  Resolving packages...
error Couldn't find package "@omniphx/adminite-ui-components" on the "npm" registry.
info Visit https://yarnpkg.com/en/docs/cli/add for documentation about this command.

在阅读了使用 yarn 的私人 repos 之后,我认为诀窍是由于 yarn 的 rc 格式略有不同。不幸的是,这也不起作用,yarn 仍然无法找到私有注册表。

.npmrc

registry=https://registry.npmjs.org
@omniphx:registry=https://npm.pkg.github.com/omniphx

.yarnrc

registry "https://registry.npmjs.org"
"@omniphx:registry" "https://npm.pkg.github.com/omniphx"

还确认我的 github 令牌也设置为 yarn config list

yarn config v1.19.0
info yarn config

  'version-tag-prefix': 'v',
  'version-git-tag': true,
  'version-commit-hooks': true,
  'version-git-sign': false,
  'version-git-message': 'v%s',
  'init-version': '1.0.0',
  'init-license': 'MIT',
  'save-prefix': '^',
  'bin-links': true,
  'ignore-scripts': false,
  'ignore-optional': false,
  registry: 'https://registry.npmjs.org',
  'strict-ssl': true,
  'user-agent': 'yarn/1.19.0 npm/? node/v12.11.1 darwin x64',
  email: 'mattjmitchener@gmail.com',
  lastUpdateCheck: 1570679687836,
  username: 'omniphx',
  '@omniphx:registry': 'https://npm.pkg.github.com/omniphx'

info npm config

  '//npm.pkg.github.com/:_authToken': 'fake12345',
  registry: 'https://registry.npmjs.org',
  '@omniphx:registry': 'https://npm.pkg.github.com/omniphx',
  python: '/usr/bin/python'

有什么想法吗?


已解决

Changed "@myorg:registry" "https://npm.pkg.github.com/myorg"
To      "@myorg:registry" "https://npm.pkg.github.com"

【问题讨论】:

此修复对您的情况有帮助吗? ***.com/questions/58430182/… 【参考方案1】:

我不是 npm/yarn 方面的专家,所以我可能会误解这里发生的事情,但我认为 npm 注册表中的包代理还不能与 yarn 一起使用。这可能有关系吗?当为 npm 发布包代理时,我记得我在 Twitter 上读过一些人用 yarn 尝试过 cmets,但它不起作用。

在此处找到 Twitter 线程: https://twitter.com/github/status/1171832034580451328

它不适用于 Yarn。一旦我更改注册表 url -> 找不到包。

【讨论】:

【参考方案2】:

我刚刚遇到了类似的情况。 yarn 似乎只是在主 Yarn 包注册表中查找我组织的私有包。我已经从 GitHub 的 Packages 文档中复制了示例,用于将您的 .npmrc 文件直接构建到将使用该应用程序的项目中的 .yarnrc 文件中,但不知道格式不同(我从来没有处理过@ 987654324@ 之前的文件)。

但是,在使用您上面提到的正确格式(我也在谷歌搜索中发现)更新 .yarnrc 文件后,yarn 成功找到了私有包并正确安装了它。

提醒一下,我的yarn 版本:1.17.3

我采取的步骤

    开始新的终端会话 cd给项目 nvm use(如果您要使用特定的节点版本) 将格式正确的.yarnrc 文件添加到项目中。请参阅下面的外观。 手动将包和版本范围添加到我的私有包的package.json 运行npm login --registry=https://npm.pkg.github.com --scope=@MyOrg 请参阅下面关于范围/组织陷阱的注释 运行yarn

这对我有用。

.yarnrc

"@myorg:registry" "https://npm.pkg.github.com"

注意:有关组织/范围名称陷阱的注释,请参见下文

其他说明

我知道,鉴于您在上面的 GH 用户名/范围,我知道您似乎对此没有任何问题,但是对于来到这里的其他任何人,关于映射您的用户名/的 GH 文档有点稀疏org 名称到包名称中的范围。请记住这些小问题:

包的名称必须始终限定在您的组织(或用户名)范围内 例如,name: @johndturn/my-package 如果您的组织中有大写字母,例如MyOrg,只需将它们替换为您的package.json 中的包名称您的.yarnrc 用小写 例如,name: @myorg/my-package 注意:当使用npm login 进行身份验证时,我仍然在--scope= 参数中保留了大写字母。 包的名称不必与 repo 的名称相同。 例如,对于名为 MyOrg/random-prefix.js-lib 的存储库,您可以在项目本身的 package.json 文件中包含 name: @myorg/js-lib。然后,在其他项目中安装它看起来像@myorg/js-lib: 1.0.0

【讨论】:

也为我工作,谢谢。现在弄清楚如何在我的 CI 中设置它,它不在 Github Actions 上运行,而是在 jenkins 上运行。 @DhwaneetBhatt 很好的问题,它应该相当简单,有一些假设。如果您在 Jenkins 中使用 Pipelines 和 Jenkinsfile 运行,我的假设是您可以简单地将上述命令(如 npm login ...)添加到您的 Jenkinsfile 中,预先构建步骤。这还假设您已通过 GitHub 组织中的某种用户对 Jenkins 进行了身份验证,该用户具有从您的组织中提取包的正确权限。也就是说,我还没有为我们的 Jenkins 盒子实现它,但我会在我实现的时候通知你(如果它与我提到的不同)。 感谢您的回复!看起来我的问题是我有"@myorg:registry" "https://npm.pkg.github.com/myorg" 而不是"@myorg:registry" "https://npm.pkg.github.com"。奇怪的是,相同的网址在我的 .npmrc 中运行良好 @MatthewMitchener 看起来您找到了最简单的答案:只需将 /myorg 留在您的 .npmrc 中,然后 GitHub 包注册表即可使用 yarn 或 npm。 (无需单独的.yarnrc。)【参考方案3】:

我遇到的问题略有不同。

在尝试了 John 的建议后,我仍然无法使用 yarn 添加私有注册表包(但使用 npm 完全没问题)

然后我意识到两件事:

对于 GitHub 包,npm 两者都可以

registry=https://npm.pkg.github.com/my-org

@my-org:registry=https://npm.pkg.github.com

yarn 只允许后一种语法。

Github 网站上的文档只显示了第一个可能给 yarn 用户带来问题的语法。

另一件事是,如果你 npm login 到私有注册表但在你的项目中使用 .yarnrc 文件,yarn 不能真正将你的 npm 凭据与它混合。虽然它在不同的环境中似乎表现不同。

但坚持使用yarn login + .yarnrcnpm login + .npmrc 似乎是最佳实践(在这两种情况下,您仍然可以使用 yarn 来管理您的包)

【讨论】:

对于这两种不同的格式,这篇 Github 博客文章解释了迁移:github.blog/…registry= 格式通过 github 包注册表启用所有 npm 包的代理,而@my-org:registry: 将锁定仅对 github 包注册表的请求。

以上是关于Yarn 找不到私有的 Github npm 注册表的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Gemfury 作为私有 npm 注册表与 Yarn 结合使用?

无法从 GitHub NPM 注册表 (npm.pkg.github.com) 通过 yarn 下载依赖项

从 Github 包注册表安装私有包失败,未找到/未授权

通过 npm 安装后找不到 yarn 命令

使用 Yarn 从 Github 包注册表安装私有包失败,未经授权

使用 Yarn 或 NPM 进行原生反应找不到 @expo/bunyan。我必须做啥?