在 package-lock.json 中解析 URL 有啥意义?
Posted
技术标签:
【中文标题】在 package-lock.json 中解析 URL 有啥意义?【英文标题】:What is the point of having resolved URL in package-lock.json?在 package-lock.json 中解析 URL 有什么意义? 【发布时间】:2019-05-17 19:19:00 【问题描述】:每当我生成一个包锁定文件时,还有一个看起来像这样的“已解决”块:
"resolved": "http://devel.npm.registry:4873/lodash/-/lodash-4.17.5.tgz"
这个网址有什么意义?稍后,如果我尝试基于这个包锁安装依赖项,是否需要使用相同的 npm 注册表?因为我们使用不同的 npm 注册表进行本地开发和生产构建。因此我在开发时使用devel.npm.registry
,但CI工具使用production.npm.registry
。根据我的测试,URL 无关紧要(我试过npm@6.4.1
)。但是是当前的实现很快就会改变,还是故意忽略 URL?我感觉以前的一些 npm 版本实际上检查了解析的 URL。
documentation 在这种情况下没有多大帮助。
【问题讨论】:
最终我找到了解释它的评论:github.com/npm/npm/issues/16849#issuecomment-312442508 【参考方案1】:我在网上找到了一些关于这个问题的文章。点击链接:
npm 使用 JSON 作为锁定文件的格式。好消息是 npm@5.0.0 忽略 package-lock.json 文件中的已解析字段,并且基本上回退到 .npmrc 中定义的字段,或者使用 CLI 通过 --registry 参数(以防万一存在),否则,它将使用已解析字段中的定义。
https://medium.com/verdaccio/verdaccio-and-deterministic-lock-files-5339d82d611e
另一天,关于 #npm5 好东西的另一条推文。
npm 现在不知道您使用哪个注册表来生成 package-lock.json。
https://twitter.com/maybekatz/status/862834964932435969
在 package-lock.json 中解析的目的是在您丢失包时绕过依赖解析步骤(获取元数据)。完整性是验证你得到的是同样的东西。如果没有 resolve 字段,未缓存的安装可能会因元数据更改而中断,而且速度也会明显变慢,因为我们必须先获取完整的元数据,然后才能真正下载任何内容。
请注意,package-lock.json 不允许从不同的注册表获取不同的包。即使你有一个使用不同解析字段的不同包的包锁,所有包都将始终从你当前的 registry= 设置中获取,在 npmrc 中。与配置的注册表不匹配的已解析字段将通过我上面提到的(较慢的)元数据获取,但仍将仅从当前注册表中获取。
https://github.com/npm/npm/issues/16849#issuecomment-312442508
【讨论】:
感谢您挖掘这些内容。我承认仍然不完全清楚为什么“已解决”的存在可以让您绕过 Kat Marchán 提到的“获取元数据”步骤,甚至那是什么!谁能详细说明这个机制到底发生了什么? 谢谢,这也消除了我的一些误解——竖起大拇指! :) 你能详细举个例子吗? 很棒的参考,尤其是来自官方 npm 开发人员的最后一个。但是在引用的答案中,“元数据获取”到底是什么意思?以上是关于在 package-lock.json 中解析 URL 有啥意义?的主要内容,如果未能解决你的问题,请参考以下文章
package-lock.json和package.json区别
npm5 package-lock.json 不同机器上的不同条目
Angular 应用程序中需要 package.json、package-lock.json 文件