Yarn: 支持私有包

创建于 2016-10-06  ·  69评论  ·  资料来源: yarnpkg/yarn

为了允许安装私有包, Yarn 需要向请求的标头发送一个令牌。

私有包是@scoped/packagesnpm publish --access=restricted 。 包的权限通过尚未添加的npm accessnpm team进行管理

在 npm 客户端中,这个令牌来自.npmrc并且看起来像这样:

<strong i="15">@nameofscope</strong>:registry=https://registry.npmjs.com/
//registry.npmjs.com/:_authToken=abc123

它作为此标头发送:

Authorization: Bearer abc123
# alternatively:
Authorization: Basic username:password # <= base64

有一个用于检索令牌

这个令牌被添加到.npmrc上的npm login 。 但是yarn login甚至不进行身份验证(它只存储用户名和电子邮件),因此我们可能希望强制用户在安装时进行身份验证(在这种情况下,我们需要通过某种方式解决为 CI 服务器编写这些安装的脚本环境变量)。

我们还需要确保 Yarn 用户不会意外地公开发布某些内容。

cat-compatibility triaged

最有用的评论

请使用赞而不是评论。

所有69条评论

我们已经有NPM登录和身份验证逻辑在这里。 只需要理顺工作流程。

私有注册并不总是需要身份验证令牌。 例如,我们通过企业 VPN 访问我们的私有注册表。

^^ 同意。 允许关联一个单独的注册表 _per scope_ 对我们来说就足够了(我怀疑还有很多其他的)。

在这种情况下,我们需要通过某种环境变量解决为 CI 服务器编写这些安装的脚本

当我们说“我们已经有了这个逻辑”时 - 我没有看到授权标头将被发送到注册表的任何路径。 如果有的话,也许会有一个临时的解决方法来使这一切正常工作,同时解决一些更最终的问题。 我错过了什么吗?

+1 看起来像作用域包,即使它们是公开的似乎也失败了。

为了进一步@djforth的评论,我刚刚从 master 安装,并且遇到相同的错误 - 范围包失败。 它将包名称中的/转换为%2f ,这意味着对 npm 查找包的请求失败。

例如Error: https://registry.yarnpkg.com/@company%2fdata: Not found

如果需要身份验证,这就是失败的方式。 我让它适用于公共范围的包

应该由 #839 和 #1146 修复。

@devonggovett我遇到了几个问题:


这是检查是否应该使用 auth :

    if (this.token || (alwaysAuth && requestUrl.startsWith(registry))) {
      headers.authorization = this.getAuth(pathname);
    }

如果注册表是http://registry.npmjs.org/则 https 请求将无法附加身份验证,因为requestUrl.startsWith(registry)


我将yarn config get registry设置为registry.yarnpkg.org并且在尝试获取我的私有模块时使用@my-org:registry': 'https://registry.npmjs.org/', ,而不是使用


所以对我来说修复是:

//if (this.token || (alwaysAuth && requestUrl.startsWith(registry))) {
if (this.token || (alwaysAuth)) {

我还收到了对NpmRegistry#request@my-org%2fmodule的初始呼叫。

是的,目前它将https://registry.npmjs.com/替换为https://registry.yarnpkg.com/ here ,这会混淆这里的检查。

编辑:忽略这篇文章 - 它出于某种原因才开始工作。

我必须确保使用npm adduser --registry=http://registry.npmjs.org --scope=<strong i="7">@foo</strong> --always-auth登录 npm 上的scope npm adduser --registry=http://registry.npmjs.org --scope=<strong i="7">@foo</strong> --always-auth


当我运行时:

npm3 adduser --registry=http://registry.npmjs.org --scope=<strong i="12">@foo</strong> --always-auth

我的 npm 看起来像这样:

_auth="xxx"
[email protected]
strict-ssl=false
//registry.npmjs.org/:_authToken=xxx
registry=http://registry.npmjs.org/
<strong i="16">@foo</strong>:registry=http://registry.npmjs.org/
save=false
save-exact=false
save-prefix=^
always-auth=true

NpmRegistry#getAuth看起来像这样:

  getAuth(packageName: string): string {

    if (this.token) {
      return this.token;
    }

    for (let registry of [this.getRegistry(packageName), '', DEFAULT_REGISTRY]) {
      registry = registry.replace(/^https?:/, '');

      // Check for bearer token.
      console.log({registry})
      let auth = this.getScopedOption(registry, '_authToken');
      if (auth) {
        return `Bearer ${String(auth)}`;
      }

      // Check for basic auth token.
      auth = this.getScopedOption(registry, '_auth');
      if (auth) {
        return `Basic ${String(auth)}`;
      }

      // Check for basic username/password auth.
      const username = this.getScopedOption(registry, 'username');
      const password = this.getScopedOption(registry, '_password');
      if (username && password) {
        const pw = new Buffer(String(password), 'base64').toString();
        return 'Basic ' + new Buffer(String(username) + ':' + pw).toString('base64');
      }
    }

    return '';
  }

它最终使用授权标头Basic xxx 。 它使用_auth键。

嘿,
有没有人设法发布到用 Sinopia 创建的私有 npm 注册表。 我可以用npm publish做到这一点,但yarn publish在发布步骤上需要永远。 我已经用yarn config set registry更改了注册表。 我注意到的其他内容在登录步骤中没有提示我输入密码

是否正在修复私人包裹? 上面描述的@devongovett问题只是在 CI 中咬了我。 我目前的解决方法是yarn config set registry https://registry.npmjs.org/以便纱线根据私人包的请求设置身份验证令牌。

我也遇到了yarn login不要求输入密码的问题,因此我无法使用 Gemfury (https://gemfury.com)。 我不确定它是否与这个问题有关。 我应该为此创建一个单独的问题吗?

我还没有看到的另一个用例提到:

可以通过 https 或 ssh 获取 git 存储库。 如果回购是私有的,您需要凭据(废话)。 部署到 Heroku 时, .netrc是使用.netrc buildpack进行身份验证的最佳方式

@rovansteen yarn login故意不要求输入密码。 我们不想存储凭据或 api 令牌,因为这是一种糟糕的安全做法

@thejameskyle啊,这是有道理的。 我注意到 Gemfury 也有一种使用 API 令牌的方法,并且可以很好地与 Yarn 配合使用。 谢谢!

我们在从与作用域相关的私有注册表中获取实际 tarball 时遇到问题。 元数据很好,但看起来授权标头没有包含在对 tarball 的请求中。

NpmRegistry#request这一行似乎是罪魁祸首——它使用 tarball 的路径调用getRegistry ,而它似乎期待的是一个包名。 正因为如此,它无法发现范围,它会回退到默认注册表的设置。

我可以想象扩展getScope以尝试从 URL 确定范围(我很乐意打开 PR 这样做),但这似乎可能容易出错。 也许需要查明相关的包名?

(编辑:看起来这也出现在 https://github.com/yarnpkg/yarn/issues/1619#issuecomment-258282647)

我看到与@dfreeman相同的问题,范围被识别并查询注册表。 检索到正确的 tarball url 和哈希,但下载不包含正确的授权标头,导致下载没有响应正文。 然后 Yarn 因哈希不匹配而退出。 该错误总是用but got da39a3ee5e6b4b0d3255bfef95601890afd80709抱怨,它是一个空文件的 sha。

> touch empty
> openssl sha1 empty
SHA1(empty)= da39a3ee5e6b4b0d3255bfef95601890afd80709

编辑:让我知道这是否应该作为一个新问题提出

基本上,我让纱线以某种方式对 jfrog 进行了身份验证。 然而,出版似乎被打破了。
它只是卡住了,我不确定如何继续,因为没有详细的日志或其他任何内容。 我什至看不到由上传引起的任何网络流量。

$ yarn publish --access restricted --new-version 2.0.2+1478176271464 .
yarn publish v0.16.1
[1/4] Bumping version...
info Current version: 2.0.2+SNAPSHOT
info New version: 2.0.2+1478176271464
[2/4] Logging in...
[3/4] Publishing...

请使用赞而不是评论。

我知道我们应该投票而不是评论,但最后一条评论已经快 2 个月了,我有点不确定是否有什么我们可以帮忙的?!

在您的用户文件夹(在 mac 上)的根目录下有一个.yarnrc文件,其中包含

注册表“ https://npm.some-internal-site.tld

我能够下载一些内部包。 最大的警告是它的访问由站点而不是用户名/密码控制。
希望这可以帮助。

很确定这是有效的......? 几个月来,我一直将yarn与私有范围的包一起使用。

@thejameskyle - 您还在使用私有范围的包时遇到问题吗?

@shakefu此时我对私有包的唯一问题是我需要在.npmrc文件的顶部添加一个registry=https://registry.npmjs.org/ ,因为npm login只是添加了一行令牌,但没有别的。

我们还将纱线与私有范围的包一起使用,并且效果很好。 我的 .npmrc 中唯一的东西是prefix=/Users/./npm//registry.npm.../authToken行。

也许确保 npm 是最新的,清除文件并再次登录?

我们团队另一个人发现, registry在指令.npmrc完全搞砸了他们获得私人范围的封装能力。

@hereandnow我的.npmrc文件位于项目的根目录,包含以下内容:

//registry.npmjs.org/:_authToken=${NPM_TOKEN}

如前所述,私有范围的包与 npm 的工作方式相同。
我假设纱线版本是>= 0.19.1并且你是export ing NPM_TOKEN某处。

谢谢你们的帮助'!

仅当带有//registry.npmjs.org/:_authToken=${NPM_TOKEN}的 .npmrc 位于项目的同一根目录中时才有效。 如果使用标准程序在%LOCALUSER%文件夹(Mac 或 Windows)中创建,则不会: npm login

如何解决这个问题?

@carmelone尝试修改主目录中的.npmrc registry=https://registry.npmjs.org/以在顶部包含

不,我正在使用私有存储库。 除了我从 npmjs 下载的一些@scopedpackages之外,它可以工作,但我仍然不知道该怎么做。

我认为这也是我们的问题,@carmelone。 私有注册表和 npmjs 注册表的组合是问题所在,对吗?

当我将私有注册表范围添加到~/.yarnrc时,我可以从私有注册表安装一些软件包。 有些是那些没有来自 NPMJS 注册表的依赖项。

@jakubzitny ,是的,而且当我npm login npm 在我的 %USERFOLDER% 中正确创建一个带有身份验证令牌的文件 .npmrc 时。 我不想在项目的 .npmrc 中拥有该身份验证,只是在我 PC 上的用户名文件夹中。 这就是问题。 yarn 无法识别该身份验证令牌。

@jakubzitny @carmelone所以问题是混合来自私有和公共存储库的嵌套依赖项? 我敢打赌,目前这不适用于纱线。 这听起来像你应该打开另一个问题。

我试图让私有范围的模块(在 npm 注册表中)工作,我不得不在 .yarnrc 中设置注册表配置(通过 yarn 配置)。

$ yarn config set registry https://registry.npmjs.org/

对于必须设置注册表的人,您是否尝试过npm login --scope=@<yourscope> ? 这每次都对我有用。

至少对我来说不起作用的是来自 bintray.com 私有注册表的范围私有包。 在依赖解析工作期间会发生注册表身份验证,但是 bintray.com 注册表返回的下载链接指向不同的域,因此 yarn 没有发送正确的身份验证令牌来下载它。

@shishkin您是否尝试过使用“npm config set always-auth true”。 出于安全原因,此设置默认关闭。 请参阅https://docs.npmjs.com/misc/config

@shishkin您是否尝试过使用“npm config set always-auth true”。 出于安全原因,此设置默认关闭。 请参阅https://docs.npmjs.com/misc/config

@Tapppi是的,我试过了。 同样的错误。

我想我会把它放在这里,以防其他人在安装私有软件包时仍然遇到问题,即使您在本地机器上安装了较新版本( >v0.16 )的纱线。 您可能会看到 404 错误,大致如下:

error An unexpected error occurred: "https://registry.yarnpkg.com/@{ORG}/{PACKAGE}/-/{PACKAGE}-1.0.0.tgz: Request failed \"404 Not Found\"".
info If you think this is a bug, please open a bug report with the information provided in "/Users/{USER}/{project}/yarn-error.log".
info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.

这对我有用,希望它有所帮助。

npm logout
yarn logout

rm -rf ~/.npmrc
rm -rf ~/.yarnrc

npm login
yarn login

那么我今天可以只使用yarn add安装一个私有包吗? 还是我需要做其他事情

我在 Windows 10 上使用 v0.22.0-20170228.1421 尝试了@vitalbone的步骤。 我仍然遇到错误,必须在我的 .npmrc 中注释掉 auth 行才能使其正常工作。

注销和登录绝对不是我们的选择,因为这会使所有现有令牌无效。

@StephanBijzitter我认为您不需要注销或再次登录,删除 *rc 文件应该允许您在登录时获取新令牌而不会使旧令牌无效。 不过,不确定这是否适合你。

是的,我确认生成(或存储,无论你喜欢什么)一个 .npmrc 文件适用于 Yarn 的私有、范围包。

<strong i="5">@myprivaterepo</strong>:registry=https://npm.myprivaterepo/
//npm.myprivaterepo/:_authToken=$NPM_TOKEN

似乎没有拿起 .npmrc,因为我在访问此私有包时遇到禁止错误

我一直在努力解决这个问题。 我们使用 Sonatype 在内部托管了我们自己的私有 NPM 存储库,但无法使用 Yarn 进行安装,但 NPM 工作得很好。

我们设法让我们的 Codebox 私有 npm 项目 (https://github.com/craftship/codebox-npm) 使用always-auth=true (https://github.com/craftship/codebox-npm/issues/ 30) .npmrc文件中的选项。

虽然您可以获得托管注册表,但项目本身是完全开源的,因此如果您的团队使用 GitHub(因为它用于身份验证)并且您在 AWS 上,您可以使用无服务器框架轻松部署它。

只是想我会分享。

我也遇到了 Sinopia 的同样问题。 有没有人为此找到解决方案?

它在 .npmrc 位于~/.npmrc所有环境中都无法正常工作。 在我的本地机器上它工作正常,但是当我在 Docker 中运行它时,当 cwd 不是~时,它看不到~/.npmrc ~ 。 您可以使用yarn config list命令检查它。

在我的本地机器上它输出:

yarn config v0.23.2
info yarn config
{ 'version-tag-prefix': 'v',
  'version-git-tag': true,
  'version-git-sign': false,
  'version-git-message': 'v%s',
  'init-version': '1.0.0',
  'init-license': 'MIT',
  'save-prefix': '^',
  'ignore-scripts': false,
  'ignore-optional': false,
  registry: 'https://registry.yarnpkg.com',
  'strict-ssl': true,
  'user-agent': 'yarn/0.23.2 npm/? node/v7.9.0 darwin x64',
  lastUpdateCheck: 1492804696073 }
info npm config
{ '//npm.example.com/:_authToken': 'XXXXX-YYYYYY-ZZZZZ',
  '<strong i="11">@example</strong>:registry': 'https://npm.example.com/' }
✨  Done in 0.05s.

在 Docker 内部,它输出:

root<strong i="15">@a1c3c4fb1fb8</strong>:/app# yarn config list
yarn config v0.23.2
info yarn config
{ 'version-tag-prefix': 'v',
  'version-git-tag': true,
  'version-git-sign': false,
  'version-git-message': 'v%s',
  'init-version': '1.0.0',
  'init-license': 'MIT',
  'save-prefix': '^',
  'ignore-scripts': false,
  'ignore-optional': false,
  registry: 'https://registry.yarnpkg.com',
  'strict-ssl': true,
  'user-agent': 'yarn/0.23.2 npm/? node/v7.9.0 linux x64',
  lastUpdateCheck: 1492856034840,
  version: '0.23.2' }
info npm config
{ version: '0.23.2',
  loglevel: 'info' }
Done in 0.03s.

所以看起来它没有正确执行npm config

作为临时解决方法,在 Docker 中,我只是将~/.npmrc复制到/app/.npmrc

在这里找到https://github.com/uber/react-map-gl

yarn start v0.23.2
$ (cd examples/custom-interactions && (path-exists node_modules || yarn) && yarn run start-local)
sh: path-exists: command not found
yarn install v0.23.2
[1/4] 🔍  Resolving packages...
[2/4] 🚚  Fetching packages...
error An unexpected error occurred: "https://unpm.uberinternal.com/flow-remove-types/-/flow-remove-types-1.1.2.tgz: Request failed \"401 Unauthorized\"".
info If you think this is a bug, please open a bug report with the information provided in "/react-map-gl/examples/custom-interactions/yarn-error.log".
info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.
error Command failed with exit code 1.

我对剑道角度组件也有同样的问题。

C:\WorkingFolder\Projects\NG4\wck-management>yarn
纱线安装 v0.23.4
info 未找到锁定文件。
[1/4] 解析包...
[2/4] 正在获取包...
警告 您的网络连接似乎有问题。 正在重试...
警告 您的网络连接似乎有问题。 正在重试...
警告 您的网络连接似乎有问题。 正在重试...
错误发生意外错误:“ http://registry.npm.telerik.com/@progress%2
fkendo-angular-buttons/-/kendo-angular-buttons-1.0.0.tgz:请求失败\"503 S
服务不可用\""。
info 如果您认为这是一个错误,请打开包含信息 p 的错误报告
包含在“C:\WorkingFolder\Projects\NG4\wck-management\yarn-error.log”中。
信息访问https://yarnpkg.com/en/docs/cli/install获取有关此的文档
命令。

现在应该修复了。
如果您有一些自定义示例不起作用,请打开一个新问题。
在这种情况下提供重现步骤很重要。

太棒了@bestander! 预计可以使用的最低纱线版本是多少?

跨版本有多个修复。
0.26 应该全部都有

2017 年 5 月 23 日星期二 19:44,Alexander Kachkaev通知@github.com
写道:

真棒@bestander https://github.com/bestander ! 最低限度是多少
预计可以使用的纱线版本?


你收到这个是因为你被提到了。

直接回复本邮件,在GitHub上查看
https://github.com/yarnpkg/yarn/issues/521#issuecomment-303492335或静音
线程
https://github.com/notifications/unsubscribe-auth/ACBdWC90PKrW5LAg7HyY3l7c8ZoKaWtyks5r8yb9gaJpZM4KPd0N
.

我可以确认具有.npmrc定义的范围和注册表的私有范围包开始在 Yarn 0.24.6 中工作(在 Yarn 0.24.5 中不起作用)。 谢谢!

纱线安装
纱线安装 v0.24.6
info 未找到锁定文件。
[1/4] 解析包...
警告 cldr-data > cldr-data-downloader > [email protected]:这个包已经重新集成到 npm 中,现在相对于 npm 已经过时了
警告 cldr-data > cldr-data-downloader > request > [email protected] :改用 uuid 模块
[2/4] 正在获取包...
警告 您的网络连接似乎有问题。 正在重试...
警告 您的网络连接似乎有问题。 正在重试...
警告 您的网络连接似乎有问题。 正在重试...
警告 您的网络连接似乎有问题。 正在重试...
警告 您的网络连接似乎有问题。 正在重试...
警告 您的网络连接似乎有问题。 正在重试...
警告 您的网络连接似乎有问题。 正在重试...
警告 您的网络连接似乎有问题。 正在重试...
错误 发生意外错误:“ http://registry.npm.telerik.com/@progress%2fkendo-angular-inputs/ -/kendo-angular-inputs-1.0.3.tgz: ESOCKETTIMEDOUT”。
信息 如果您认为这是一个错误,请使用“[...]\yarn-error.log”中提供的信息打开错误报告。
信息 请访问https://yarnpkg.com/en/docs/cli/install以获取有关此命令的文档。

纱线安装 v0.24.6
info 未找到锁定文件。
[1/4] 解析包...
[2/4] 正在获取包...
错误发生意外错误:“ http://registry.npm.telerik.com/@progress%2fkendo-angular-l10n/ -/kendo-angular-l10n-1.0.0.tgz: connect ETIMEDOUT 23.253.4.114:80” .
info 如果您认为这是一个错误,请打开包含信息 p 的错误报告
包含在“....\yarn-error.log”中。
信息访问https://yarnpkg.com/en/docs/cli/install获取有关此的文档
命令。

好像无法连接到telerik.com,是否配置了http代理?

问题是 yarn 正在通过http://registry.npm.telerik.com进行搜索,当我使用 strict-ssl 将 yarn 配置为 true 时:

信息纱线配置
{ '版本标签前缀':'v',
'version-git-tag': 真,
“版本-git-sign”:假,
'version-git-message': 'v%s',
'初始化版本':'1.0.0',
'init-license': 'MIT',
'保存前缀': '^',
'忽略脚本':假,
'忽略可选':假,
注册表:' https://registry.yarnpkg.com ',
'strict-ssl': 真,
“用户代理”:“纱线/0.24.6 npm/? 节点/v6.9.5 win32 x64',
最后更新检查:1496137030541 }
信息 npm 配置
{ 'strict-ssl': 真,
'@progress :registry ': ' https://registry.npm.telerik.com/ ',
'//registry.npm.telerik.com/:_authToken': '......' }
在 0.04 秒内完成。

以前我用 npm 配置了登录:“npm login --registry= https://registry.npm.telerik.com/ --scope=@progress

通过“https”(https://registry.npm.telerik.com)搜索纱线是必要的:-)

知道有什么问题吗?

我没有太多使用私有注册表的经验:(
如果有人为我建立了一个帐户和一个项目 package.json/yarn.lock
测试我可以帮忙。

五月2017年30 10:53,beatrizaldaz [email protected]写道:

问题是纱线正在通过http://registry.npm.telerik.com搜索,
当我使用 strict-ssl 将 yarn 配置为 true 时:

信息纱线配置
{ '版本标签前缀':'v',
'version-git-tag': 真,
“版本-git-sign”:假,
'version-git-message': 'v%s',
'初始化版本':'1.0.0',
'init-license': 'MIT',
'保存前缀': '^',
'忽略脚本':假,
'忽略可选':假,
注册表:' https://registry.yarnpkg.com ',
'strict-ssl': 真,
“用户代理”:“纱线/0.24.6 npm/? 节点/v6.9.5 win32 x64',
最后更新检查:1496137030541 }
信息 npm 配置
{ 'strict-ssl': 真,
' @progress https://github.com/progress :registry': '
https://registry.npm.telerik.com/ ',
'//registry.npm.telerik.com/:_authToken': '......' }
在 0.04 秒内完成。

以前我用 npm 配置了登录:“npm login --registry=
https://registry.npm.telerik.com/ --scope=@progress
https://github.com/progress "

需要纱线通过“https”(
https://registry.npm.telerik.com) :-)

知道有什么问题吗?


你收到这个是因为你被提到了。
直接回复本邮件,在GitHub上查看
https://github.com/yarnpkg/yarn/issues/521#issuecomment-304830178或静音
线程
https://github.com/notifications/unsubscribe-auth/ACBdWA3GrsEnpn64ppJRL2cvJ-ayhvh5ks5r--cFgaJpZM4KPd0N
.

好的,我会创建一个项目,使用telerik试用帐户来测试问题,我将在github中将项目链接发送给您。

那太好了,@beatrizaldaz。
那你能不能只为这种情况开一个新问题?
单独跟踪它会更容易。

关于@beatrizaldaz帖子/ Telerik。 我有同样的问题。 详细地说,我做了一些尝试
使用以下配置 (.npmrc)。 它似乎几乎可以工作,但连接是在 http 而不是 https 中建立的
所以被拒绝了。 是否有任何临时解决方法(严格模式不起作用)?

<strong i="9">@progress</strong>:registry=https://registry.npm.telerik.com/
//registry.npm.telerik.com/:_authToken="YOUR_SECRET_HERE"
always-auth=true
registry="https://registry.npmjs.com/"

所以我昨天刚遇到这个( yarn是 0.24.6)。 我不确定究竟是什么原因造成的,因为它已经运行了一段时间。 我的解决方案是完全删除.npm文件夹和.npmrc文件,运行yarn cache clean ,再次使用npm login登录,之后一切似乎都正常了。 我最近一直在通过nvm在 node 和 npm 的版本之间切换,这可能是罪魁祸首吗? 值得注意的是,我还在故障排除过程中的某个时候使用--ignore-dependencies标志卸载并重新安装了yarnbrew ,但这本身并没有解决问题。

还有一点要注意,如果它甚至相关,在这些步骤的过程中尝试yarn login时,它会出于某种原因挂在密码提示上,这就是我执行npm login

相关: https :

你好,
几个月过去了:有什么消息吗?

此页面是否有帮助?
0 / 5 - 0 等级