纱线/ npm5锁定文件和精确包装版本之间的区别?

时间:2017-05-31 06:05:04

标签: npm yarnpkg

我的简单问题是:为什么我不能在package.json中使用确切的版本?这与锁文件有什么不同?

1 个答案:

答案 0 :(得分:6)

主要区别在于lockfiles还锁定嵌套依赖项 - 依赖项的所有依赖项,依此类推。管理和跟踪所有这些更改可能非常困难,并且使用的软件包数量会呈指数级增长。

在某些情况下,您无法手动指定应使用特定版本的软件包 - 请考虑分别在foo~1.0.0指定~2.0.0的2个库。主要版本的差异告诉我们foo @ v1的API不会与foo @ v2的API匹配,因此您无法在应用级别覆盖包版本而不会导致冲突和失败。

最后,你可能想知道"为什么总要有semver呢?为什么不手动指定所有包依赖的确切版本?" semver的主要优点之一是它意味着每当子依赖关系更新时,您都不必更新树中的每个依赖项。如果我依赖foo,并且foo依赖于bar,而bar只是有一个已修补的关键错误,我们就会使用确切版本,然后在我得到修复之前还必须更新foo。如果foo和bar有不同的维护者,或者如果foo被放弃,那可能需要一段时间,我可能需要分支项目(我在Java-land中做过不止一次)。

这对于维护库的生态系统非常有用,因为它从根本上减少了依赖关系树中每个节点所需的维护工作量,从而更容易提取库和模式。我曾经有一个早期项目,我们正在构建一个使用精确版本的组件库,每当更新包含共享功能的核心库时,我们必须向其他包的每个提交一个PR更新版本,有时会将PR跟进依赖那些的组件。毋庸置疑,我们在几个月后整合了包裹。

希望有所帮助!