从 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 install
或yarn 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.json
或 yarn add
命令中匹配此大小写 - 无论您使用的是哪个。例如:
"@Pickle-Rick/schwifty": "^1.0.0"
在package.json
或yarn add @Pickle-Rick/schwifty
。
我通过挖掘yarn
github issues找到了这个解决方案。
【讨论】:
这是唯一对我有用的答案,我尝试了其他人,但他们什么也没做。我还必须将此添加到我的 github 操作 .yaml 文件中:- name: Fix .npmrc for CI/CD run: | echo "//npm.pkg.github.com/:_authToken=$ secrets.PACKAGE_TOKEN " >> ~/.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(未找到)