阅读本文前,需要先了解语义版本控制

package.json是一个文件,其中包含有关您的项目的信息(名称,版本等),并且列出了项目所依赖的package。

package.json下列出的每个依赖项之后,都有一个类似^2.20.0的数字,它是该package的版本,但在版本之前是^。 因此,^这个小家伙可以成为您项目的总破坏者。

版本之前的^符号告诉npm,如果有人clone了该项目并在目录中运行npm install,则在其node_modules中安装该package的最新次要版本。

假设我在package.json中使用^2.20.0安装了express,然后express团队发布了2.24.0版本,现在当有人clone我的repository并在该目录中运行npm install时,他们将获得版本2.24.0(您也可以输入~而不是^,它将更新为最新的补丁程序版本)

但是,如果package开发人员破坏了次要版本上的任何功能,那么这将是一个巨大的问题,因为这会使您的应用程序崩溃。

为了防止出现此潜在问题,npm在5.x.x +版本中添加使用package-lock.jsonnpm-shrinkwrap.json(如果存在)。这些文件称为package lock或lock文件。

关于package-lock.json的一个关键细节是它无法发布,并且如果在顶级package之外的任何地方都将被忽略。 它与npm-shrinkwrap.json共享一种格式,该格式本质上是相同的文件,但允许发布。 除非部署CLI工具或使用发布过程来生产production package,否则不建议这样做。

如果package-lock.jsonnpm-shrinkwrap.json都存在于package的根目录中,则package-lock.json将被完全忽略。

package-lock.json文件需要提交到您的Git repository,因此,如果项目是公共的或您有合作者,或者您将Git用作部署源,则可以由其他人获取。

当有人clone您的repository并在其计算机上运行npm install时。 NPM检查package-lock.json并按照所有者安装的方式安装该package的确切版本,因此它将忽略package.json中的^和〜

此外,package-lock.json还包含其他一些元信息,可以节省在执行npm安装时从npm提取数据的时间。

解决lock文件冲突

有时,两个单独的npm安装会创建package lock,这些package lock会导致源控制系统中的合并冲突。 从npm@5.7.0开始,可以通过手动解决任何package.json冲突,然后再次运行npm install [--package-lock-only]来解决这些冲突。 npm将自动为您解决任何冲突,并在合理的树中编写合并的package lock,其中包括来自两个分支的所有依赖项。 如果提供了--package-lock-only,它将在不修改本地node_modules的情况下执行此操作。

npm-package-locks