【问题标题】:Artifactory Dependency Rewrite for NPM fails when used with npm-shrinkwrap与 npm-shrinkwrap 一起使用时,NPM 的 Artifactory 依赖重写失败
【发布时间】:2017-01-17 19:39:03
【问题描述】:

我们正在运行 Artifactory 4.7.7 rev 40199,目的是让项目的所有 NPM 流量都通过 Artifactory。我们在将 npm-shrinkwrap 和 Github 的外部依赖重写结合使用时遇到问题。

我们目前的设置如下所示

  • npm-virtual(NPM 与项目 .npmrc 文件指向的虚拟存储库。按此顺序指向以下存储库。为 Github 设置了外部依赖关系重写)
    • npm-local(我们自己的包的本地仓库)
    • registry-npmjs-org(用于从官方 NPM 注册表缓存包的远程仓库
    • npm-github-rewrite(用于缓存重写的 Github 存储库的远程存储库)

我们看到的问题可以通过以下方式复制

  • npm install 一个带有 Github 依赖的包 (jsdoc@3.4.0)
  • Artifactory 重写并缓存 Github 依赖项(taffydb & esprima
  • npm shrinkwrap 锁定版本
  • 删除node_modules
  • 运行npm install

节点设置为不使用我们的代理,第二个npm install 失败并显示以下消息

npm ERR! fetch failed https://github.com/hegemonic/taffydb/tarball/7d100bcee0e997ee4977e273cdce60bd8933050e
npm WARN retry will retry, error on last attempt: Error: connect ECONNREFUSED 192.30.253.112:443
npm ERR! fetch failed https://github.com/ariya/esprima/tarball/49a2eccb243f29bd653b11e9419241a9d726af7c
npm WARN retry will retry, error on last attempt: Error: connect ECONNREFUSED 192.30.253.112:443
npm ERR! fetch failed https://github.com/ariya/esprima/tarball/49a2eccb243f29bd653b11e9419241a9d726af7c
npm WARN retry will retry, error on last attempt: Error: connect ECONNREFUSED 192.30.253.113:443
npm ERR! fetch failed https://github.com/hegemonic/taffydb/tarball/7d100bcee0e997ee4977e273cdce60bd8933050e
npm WARN retry will retry, error on last attempt: Error: connect ECONNREFUSED 192.30.253.113:443
npm ERR! fetch failed https://github.com/ariya/esprima/tarball/49a2eccb243f29bd653b11e9419241a9d726af7c
npm ERR! fetch failed https://github.com/hegemonic/taffydb/tarball/7d100bcee0e997ee4977e273cdce60bd8933050e
npm WARN optional Skipping failed optional dependency /jsdoc/taffydb:
npm WARN Error: connect ECONNREFUSED 192.30.253.113:443
npm WARN     at Object.exports._errnoException (util.js:1012:11)
npm WARN     at exports._exceptionWithHostPort (util.js:1035:20)
npm WARN     at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1080:14)
npm WARN  { Error: connect ECONNREFUSED 192.30.253.113:443
npm WARN     at Object.exports._errnoException (util.js:1012:11)
npm WARN     at exports._exceptionWithHostPort (util.js:1035:20)
npm WARN     at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1080:14)
npm WARN   code: 'ECONNREFUSED',
npm WARN   errno: 'ECONNREFUSED',
npm WARN   syscall: 'connect',
npm WARN   address: '192.30.253.113',
npm WARN   port: 443,
npm WARN   parent: 'jsdoc',
npm WARN   optional: '/jsdoc/taffydb' }
npm ERR! Windows_NT 10.0.10586
npm ERR! argv "D:\\Languages\\NodeJS\\node.exe" "D:\\Languages\\NodeJS\\node_modules\\npm\\bin\\npm-cli.js" "install"
npm ERR! node v6.3.1
npm ERR! npm  v3.10.3
npm ERR! code ECONNREFUSED
npm ERR! errno ECONNREFUSED
npm ERR! syscall connect

npm ERR! Error: connect ECONNREFUSED 192.30.253.113:443
npm ERR!     at Object.exports._errnoException (util.js:1012:11)
npm ERR!     at exports._exceptionWithHostPort (util.js:1035:20)
npm ERR!     at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1080:14)
npm ERR!  { Error: connect ECONNREFUSED 192.30.253.113:443
npm ERR!     at Object.exports._errnoException (util.js:1012:11)
npm ERR!     at exports._exceptionWithHostPort (util.js:1035:20)
npm ERR!     at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1080:14)
npm ERR!   code: 'ECONNREFUSED',
npm ERR!   errno: 'ECONNREFUSED',
npm ERR!   syscall: 'connect',
npm ERR!   address: '192.30.253.113',
npm ERR!   port: 443,
npm ERR!   parent: 'jsdoc' }
npm ERR!
npm ERR! If you are behind a proxy, please make sure that the
npm ERR! 'proxy' config is set properly.  See: 'npm help config'

由于某种原因,shrinkwrap 的存在似乎完全忽略了依赖项重写规则,并且无论如何都只是尝试转到 Github。

我们错过了什么吗?我们缺少一些设置步骤吗?


基于@uriah-l 帖子的其他详细信息

  1. npm-shrinkwrap.json 仅包含对 Artifactory URL 的引用。该文件中没有 GitHub 引用。
  2. 包的本地缓存版本的_resolved_fromtarball属性在它的package.json(存储在tgz旁边)设置为Artifactory urls/versions
  3. 本地缓存版本的 repository.url 属性中确实引用了 Github
  4. 已安装的 ({INSTALL_DIR}/node_modules/taffydb/package.json) 版本的软件包有它的 _resolved_fromtarball 属性,它的 package.json 设置为 Artifactory urls/versions`
  5. 原始包 (jsdoc@3.4.0) 的人工缓存版本似乎在 tgz 中的 package.json 未更改
  6. 原始包的 Artifactory Npm 信息选项卡有一个 GitHub URL,而不是另一个包的版本号 (taffydb)
  7. 已重写的包的版本 (taffydb) 出现在正确的 repo (npm-github-rewrite) 中,它们的解包 package.json 似乎没有改变

【问题讨论】:

    标签: github url-rewriting npm repository artifactory


    【解决方案1】:

    看起来 NPM 客户端在构建 npm-shrinkwrap.json 文件时依赖于已安装包的 package.json 文件中的“_resolved”字段(请参阅this client code),我相信 NPM 客户端本身会添加安装后到 package.json。从那时起,客户端在随后的安装尝试中只需遵循此文件中的任何内容,因此,如果其中一个依赖 URL 指向不是 Artifactory 的东西,它将去那里(也忽略您的 ~/.npmrc 注册表 URL,请参阅@987654322 @)

    虽然 Artifactory 重写了 package.json 中的“tarball”字段,但迄今为止,即使它可以以某种方式故意更改 _resolved 字段,它目前还没有这样做,当然假设确实存在以下情况您实际上会从 Artifactory 获得一个包含无关“_resolved”字段的包,尽管它是从 Artifactory 解决的——我完全不确定这是否可能(我们碰巧有a feature request,虽然我不能确定是否会实施)。

    编辑/澄清 - 我不确定“_resolved”字段是否纯粹是客户端字段并且不能存在于注册表中的包中,在这种情况下,它听起来像是可能超出 Artifactory 应处理的范围。

    话虽如此,当我运行您的复制步骤(从 Artifactory 解析)时,npm-shrinkwrap.json 文件中只有我的所有依赖项的工件 URL,这对您来说似乎并非如此。我认为这很可能是由于以下原因之一:

    1.您的 Artifactory 缓存包含“taffydb”软件包的原始(未重写)副本 - 尽管考虑到您可以在第一次尝试时安装它,我认为这不太可能。 2.或者,您的 NPM 缓存 (~/.npm/) 或全局 node_modules 目录包含“taffydb”包的原始副本。

    总而言之,您应该能够通过检查 {INSTALL_DIR}/node_modules/taffydb/package.json 文件来验证这一点,并检查“_resolved”字段的值是什么。您也可以尝试将其修改为您的 Artifactory URL,并查看重新生成时是否修复了 npm-shrinkwrap.json 文件。

    HTH,

    【讨论】:

    • 感谢您的详细回复。我在原始问题的底部添加了一些额外的 cmets。
    猜你喜欢
    • 1970-01-01
    • 2015-09-15
    • 2016-06-23
    • 1970-01-01
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    相关资源
    最近更新 更多