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

Posted

技术标签:

【中文标题】从 Github 包注册表安装私有包失败,未找到/未授权【英文标题】:Installing private package from Github Package registry fails with not found/not authorized 【发布时间】:2020-02-19 16:07:39 【问题描述】:

我创建并发布了一个私有 Github 包。一开始尝试用纱线安装它,我遇到了以下问题:

无论我尝试使用 yarn 还是 npm,尽管遵循 Github (https://help.github.com/en/github/managing-packages-with-github-package-registry/configuring-npm-for-use-with-github-package-registry) 记录的确切步骤,但它根本找不到包。

我的.yarnrc

registry "https://npm.pkg.github.com/OWNER"

使用yarn,它会不断尝试在https://registry.yarnpkg.com/@GITHUB_USERNAME而不是我上面输入的注册表中查找包。

备注:在.yarnrc 中需要添加注册表,语法略有不同:

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

到目前为止,我也开始尝试混合使用 .npmrc.yarnrc 配置,但没有运气。

-

编辑(部分解决)

我想出了如何使用 npm 或 - 在我的例子中 - 纱线来实际访问包。现在我面临Request failed \"401 Unauthorized\" 错误的问题,尽管我在.yarnrc 之上添加了凭据:

//npm.pkg.github.com/:_authToken=AUTH_TOKEN

.npmrc 中做同样的事情也不起作用。

【问题讨论】:

投票this proposal 以缓解标签混淆。 【参考方案1】:

我在使用 JFrog Artifactory 时遇到了同样的问题...

当我使用npm installyarn install 时,我总是出错:

 => ERROR [builder 4/6] RUN yarn install                                                                                                         61.0s
> [builder 4/6] RUN yarn install:
#12 0.358 yarn install v1.22.15
#12 0.474 [1/4] Resolving packages...
#12 1.199 [2/4] Fetching packages...
#12 6.330 error An unexpected error occurred: 
"https://customer.jfrog.io/dxg/api/npm/npm-local/@xx/components-react16/-/@xx/components-react16-1.2.0.tgz: 
Request failed \"401 Unauthorized\"".

我使用了 authToken 的生成和文件 .npmrc(user_home 文件夹)的命令:

npm login --registry=https://dxg.jfrog.net/dxg/api/npm/npm-local/ --scope=@xx

解决方案:

当我们可以直接从 Artefactory 获取 .npmrc(或 yarnrc) 文件所需的所有配置时,存在方法:

curl -u<USER_NAME>:<AUTH_TOKEN> "https://<your_domain>/artifactory/api/npm/npm-local/auth/jfrog"

从响应中获取数据后,您应该手动将其放入 .npmrc文件。

例如响应的近似结构:

@xx:registry=https://<your_domain>/artifactory/api/npm/npm-local/
//<your_domain>/dxg/api/npm/npm-local/:_authToken=<auth_Token>
//<your_domain>/artifactory/api/npm/npm-local/:_password=<password>
//<your_domain>/artifactory/api/npm/npm-local/:username=<user_name>
//<your_domain>/artifactory/api/npm/npm-local/:email=<email>
//<your_domain>/artifactory/api/npm/npm-local/:always-auth=true

【讨论】:

【参考方案2】:

我在这里添加一个答案,因为经过一天在这里和其他地方尝试不同的解决方案变体后,我发现我的问题是别的东西。

我的问题是,虽然npm 对包名称不区分大小写,但yarn 涉及身份验证! ?‍♂️

因此,使用上面accepted solution 中的示例:

registry=https://registry.yarnpkg.com/

@GITHUB_USERNAME:registry=https://npm.pkg.github.com
//npm.pkg.github.com/:_authToken=AUTH_TOKEN
always-auth=true

我需要确保两件事:

    @GITHUB_USERNAME 需要来匹配您在 github 上看到的大小写和发布包的名称。即,如果您的用户名是 Pickle-Rick,则需要输入 @Pickle-Rick:registry=https://npm.pkg.github.com,而不是 @pickle-rick@Pickle-rick

    您需要在 package.jsonyarn add 命令中匹配此大小写 - 无论您使用的是哪个。例如:

    "@Pickle-Rick/schwifty": "^1.0.0"package.jsonyarn add @Pickle-Rick/schwifty

我通过挖掘yarngithub issues找到了这个解决方案。

【讨论】:

这是唯一对我有用的答案,我尝试了其他人,但他们什么也没做。我还必须将此添加到我的 github 操作 .yaml 文件中:- name: Fix .npmrc for CI/CD run: | echo "//npm.pkg.github.com/:_authToken=$ secrets.PACKAGE_TOKEN " &gt;&gt; ~/.npmrc,因为否则它不会正确验证【参考方案3】:

我找到了解决方案,不幸的是,该解决方案在任何地方都没有很好的记录,而是混合了不同的资源——而且非常简单。

无论你使用 npm 还是 yarn,只需将以下.npmrc 放在适当的位置(yarn 也会包含这个):

registry=https://registry.yarnpkg.com/

@GITHUB_USERNAME:registry=https://npm.pkg.github.com
//npm.pkg.github.com/:_authToken=AUTH_TOKEN
always-auth=true

一些cmets:

always-auth 是必需的,至少在使用纱线时(尚未使用 npm 测试) 在.yarnrc 中添加上述内容不起作用。不知何故,当需要身份验证时,纱线会出现问题。 现在您可以使用 yarn add @GITHUB_USERNAME/PACKAGE_NAME 或等效的 npm 轻松安装您的私有包。 包括 registry=https://registry.yarnpkg.com/ 用于纱线或 registry=https://registry.npmjs.org/ 用于 npm

我希望此解决方案也适用于您的情况。否则,请告诉我您面临的问题,我很乐意分享有关此主题的一些研究以及解决方案可能隐藏的地方。

【讨论】:

谢谢,工作就像一个魅力。除了我不需要always-auth 部分。也许从那以后纱线发生了一些变化?【参考方案4】:

您需要做的是指定检索每个包的位置,在您的 .npmrc 中使用类似这样的内容(我不知道 yarn 语法,但它在读取 .npmrc 时适用于 yarn):

//registry.npmjs.org/:_authToken=<token-npm-read>
//npm.pkg.github.com/:_authToken=<token-github-package-read>
@foo:registry=https://npm.pkg.github.com
@far:registry=https://registry.npmjs.org

然后,Yarn 将在 Github 中搜索 @foo/mypackage1,其中 @far/mypackage2 将在 npmjs 中搜索。默认注册表将保留给其他人,无论您设置什么。

【讨论】:

以上是关于从 Github 包注册表安装私有包失败,未找到/未授权的主要内容,如果未能解决你的问题,请参考以下文章

在 Github Action 中通过 Yarn 从 Github 包注册表下载私有模块?发布工作,但安装遇到“401 Unauthorized”

Angular 5 - 加载资源失败:服务器响应状态为 404(未找到)

无法使用托管在 GPR 上的私有 NPM 包

`pipenv install` 从 GitLab 项目的 PyPI 注册表中成功安装了一个包,但随后在锁定步骤中失败

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

AzureDevops 静态网站未从私有源中找到 NuGet 包