2017-05-31 90 views

回答

5

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

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

最后,您可能会想:“为什么要在所有的时候都使用semver?为什么不让所有包都手动指定它们的依赖关系的确切版本?” semver的一个主要优点是它意味着当子依赖性更新时,不必更新树中的每个依赖项。如果我依赖foo,并且foo依赖于barbar只是有一个修补的重要bug,并且我们使用的是精确版本的所有内容,那么foo也必须先更新,然后才能获得修复。如果foo和bar有不同的维护者,或者如果foo被抛弃了,那可能需要一段时间,我可能需要为项目分配一些东西(我在Java-land中做过的不止一次)。

这对维护库的生态系统非常有用,因为它从根本上减少了依赖树中每个节点所需的维护工作量,使得它更易于提取库和模式。我曾经有一个早期的项目,我们正在构建一个使用精确版本的组件库,并且任何时候包含共享功能的核心库都已更新,我们必须提交一个PR到,其他软件包的每个以更新版本,以及有时会追踪PR到依赖于那些的组件。毋庸置疑,我们在几个月后合并了这些软件包。

希望有帮助!

+0

很好的解释,谢谢! – user2061057

+0

我不确定我是否按照你的第二段。在NPM中,每个模块都不是“它自己的依赖树”吗?换句话说,不是NPM OK,它有两个冲突版本的传递依赖关系,因为它使它们保持独立? – jrahhali

+0

是的,但是如果2个软件包共享相同的依赖关系,则npm只能在node_modules的顶级安装该dep一次。 https://docs.npmjs.com/how-npm-works/npm3-nondet这篇文档是针对npm3的,但它仍然适用。 – user2301179