package-lock.json 中的 npm "resolved"-fields 会随着 JFrog 工件不断变化

Posted

技术标签:

【中文标题】package-lock.json 中的 npm "resolved"-fields 会随着 JFrog 工件不断变化【英文标题】:npm "resolved"-fields in package-lock.json change constantly with JFrog artifactory 【发布时间】:2020-01-21 15:50:30 【问题描述】:

我们有一个私有的 JFrog 工件(名称在下面匿名),它在项目根 .npmrc -file 中配置了 npm:

registry=https://artifactory.jfrog.private.com:443/api/npm/npm-registry-virtual/

通过 Git 在开发人员之间共享的 package-lock.json 文件中的已解析字段在“npm install”运行之间不断变化,而 package.json 没有任何更改。

有时 dl 查询参数(指向完全相同的 URL)被添加到解析的 URL:

- "resolved": "https://artifactory.jfrog.private.com:443/api/npm/npm-registry-virtual/@sailshq/lodash/-/lodash-3.10.3.tgz",
+ "resolved": "https://artifactory.jfrog.private.com:443/api/npm/npm-registry-virtual/@sailshq/lodash/-/lodash-3.10.3.tgz?dl=https://artifactory.jfrog.private.com/@sailshq/lodash/-/lodash-3.10.3.tgz",

有时查询参数指向 npmjs.org 注册表:

 - "resolved": "https://artifactory.jfrog.private.com:443/api/npm/npm-registry-virtual/aproba/-/aproba-1.2.0.tgz",
 - "resolved": "https://artifactory.jfrog.private.com:443/api/npm/npm-registry-virtual/aproba/-/aproba-1.2.0.tgz?dl=https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",

有时该字段直接指向 npmjs.org 存储库:

- "resolved": "https://artifactory.jfrog.private.com:443/api/npm/npm-registry-virtual/acorn/-/acorn-3.3.0.tgz",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",

这些变化中的任何一个也可能走向相反的方向。

这真的很烦人,因为这意味着我们不断地在 package-lock.json 中进行无意义的更改,这会导致合并冲突并经常阻止 npm ci 正确执行。 npm cache clean --force 似乎没有帮助。我知道 npm install 可以自动解决 package-lock.json 合并冲突,但这对 npm ci 没有帮助(因为重点是 在 CI 环境中运行 npm install )。而且,无论如何,看看虚拟 npm 注册表如何在内部解析包有什么好处(我怀疑这里正在发生)?

是否有某种配置选项可以防止 JFrog Artifactory 对虚拟 npm 注册表中已解析的包 URL 进行此类更改?或者它可能是 npm 中的一个错误?

环境:

npm 6.11.3 JFrog Artifactory 6.10.6

【问题讨论】:

我没有看到 Artifactory 可以更改 package-lock.json 文件的方法。根据 npm 文档:对于 npm 修改 node_modules 树或 package.json 的任何操作,都会自动生成 package-lock.json。我相信这种行为与 npm 客户端有关 好像和***.com/questions/53127140/…一样的问题 也许这些设置与更改 package-lock.json 中的解析字段的问题有关? jfrog.com/confluence/display/RTF/…jfrog.com/confluence/display/RTF/… 它应该会影响 package-lock.json,因为在 npm 客户端知道原始 URL 之前,Artifactory 内部已经完成了更改。但是值得进一步检查 @VilleHeikkilä 你有没有想过如何保持注册表一致? 【参考方案1】:

我们的团队已成功运行 npm ci,以确保我们本地下拉和缓存的依赖项与 package-lock.json 文件匹配。

然后,进一步的npm installs 应该按预期解决。

【讨论】:

【参考方案2】:

我不知道为什么会出现这些备用网址或如何阻止它们。但是您可以使用npm-merge-driver 为您的开发人员减少(甚至可能消除!)合并冲突带来的痛苦。它是由一位在 npm cli 团队工作多年的开发人员编写的,其唯一目的是自动消除 package-lock.json 合并冲突。

【讨论】:

很遗憾没有评论 -1,因为建议的解决方案正好解决了 OP 遇到的问题。诚然,他们在问为什么出现这些 URL,而我不知道答案(并且可能需要 JFrog 现任或前任员工以任何权威的身份说出)。但是这个包解决了这个问题导致的合并痛苦,并且没有足够的人知道它。【参考方案3】:

这类事情通常是由于开发人员安装的 npm 版本略有不同。 npm 的第 7 版刚刚发布,因此现在是确保团队都安装了完全相同的版本的最佳时机。

如果这不起作用,请尝试将团队切换到 yarn 或 pnpm。

【讨论】:

这不是我的经验;相同版本的 NPM 在不同机器上产生不同的解析字段。 我们切换到pnpm 仍然有这个问题!只是流失在 pnpm-lock.yaml 文件中。

以上是关于package-lock.json 中的 npm "resolved"-fields 会随着 JFrog 工件不断变化的主要内容,如果未能解决你的问题,请参考以下文章

text package-lock.json包含不存在于package.json中的不同且有问题的npm包

如何修复 package-lock.json 中未在 package.json 中列出的易受攻击的 npm 包?

NPM5,package-lock.json 和 package.json 有啥区别?

npm-shrinkwrap.json 和 package-lock.json 有啥区别?

package.json与package-lock.json的区别

[转]npm中package-lock.json的作用:npm install安装时使用