“package-lock.json”angular色

npm @ 5已经发布了,它有一个新的特性“package-lock.json”文件(在npm安装之后),让我感到困惑。 我想知道,这个文件有什么作用?

它存储一个精确的,版本化的依赖关系树,而不是像package.json本身(例如1.0。*)那样使用星型版本化。 这意味着您可以保证其他开发人员或产品发布等的依赖关系。它也有一个locking树的机制,但是如果package.json改变,通常会重新生成。

从npm github页面 :

对于npm修改node_modules树或package.json的任何操作,将自动生成package-lock.json。 它描述了生成的确切树,以便后续安装能够生成相同的树,而不pipe中间依赖性更新如何。

这个文件旨在被提交到源代码库,并提供各种用途:

描述依赖关系树的单一表示,以保证队友,部署和持续集成确保安装完全相同的依赖关系。

为用户提供一个工具,使其能够“前进”到先前的node_modules状态,而不必提交目录本身。

通过可读的源代码控制差异来促进树更改的更大可见性。

并通过允许npm跳过以前安装的软件包的重复元数据分辨率来优化安装过程。“

编辑

回答jrahhali的问题,关于使用package.json的确切版本号。 请记住,你的package.json只包含你的直接依赖关系,而不是依赖关系的依赖关系(有时称为嵌套依赖关系)。 这意味着对于标准的package.json,你不能控制这些嵌套的依赖关系的版本,直接引用它们或者作为对等的依赖关系是无济于事的,因为你也不能控制你的直接依赖关系为这些嵌套的依赖关系定义的版本容差。

即使您locking了直接依赖关系的版本,也不能100%保证每次完全依赖关系树都是相同的。 其次,您可能希望允许直接依赖关系的非重大更改(基于语义版本控制),这样可以减less对嵌套依赖关系的控制,再加上您不能保证您的直接依赖关系在某些时候不会破坏语义版本控制规则他们自己。

所有这些的解决scheme是如上所述的locking文件locking完整依赖树的版本。 这样可以保证为其他开发人员或发行版提供依赖关系树,同时仍然允许使用标准package.jsontesting新的依赖版本(直接或间接)。

NB。 以前的收缩包json做了几乎相同的事情,但锁文件重命名,使其function更清晰。 如果项目中已经有一个收缩包装文件,那么这个文件将被用来代替任何locking文件。