4

我知道使用npm shrinkwrap有助于锁定依赖关系,以帮助保证应用程序的可复制构建。

我的问题是,如果您构建的是模块而不是应用程序怎么办?模块的每个版本都应该包含一个npm-shrinkwrap.json? 我查看了一些开源模块,但没有在它们的存储库中看到它们(例如:expressreactchaiasync)。

我的理解是 npm (>=3) 通过整合兼容版本提供的好处。例如,如果 pkg-a 依赖于 lodash^4.0.0并且 pkg-b 依赖于 lodash ^4.3.5,它只会安装最新的 lodash 4 版本的一个副本。但是如果 pkg-a 和 pkg-b 都创建了 shrinkwraps,那么它们很可能不会对应于完全相同的 lodash 版本,并且需要安装该库的两个副本,即使它们是完全兼容的版本。

不包括收缩包装的缺点是库作者正在构建一个包,该包将被其他应用程序依赖,并且当它的任何依赖项(或依赖项的依赖项,递归地)发布破坏性更改时,该包可能随时损坏次要版本或补丁版本。并且在依赖项的依赖项中断的情况下,库作者除了发布收缩包装外,无能为力。

例如,如果我的库依赖于request,它依赖于hawk,并且 hawk 在补丁版本中发布了一个重大更改,那么即使锁定到 request 的确切版本也不会修复我的库——唯一的方法(到目前为止正如我所看到的)修复我的库是发布一个缩小鹰的确切版本的收缩包装。

这变得冗长,但我试图了解是否有更好的论据在 Node 模块中使用收缩包装而不是通过使用它们来利用 npm 提供的好处。

4

0 回答 0