阅读本文前,需要先了解语义版本控制。
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.json
或npm-shrinkwrap.json
(如果存在)。这些文件称为package lock或lock文件。
关于package-lock.json
的一个关键细节是它无法发布,并且如果在顶级package之外的任何地方都将被忽略。 它与npm-shrinkwrap.json
共享一种格式,该格式本质上是相同的文件,但允许发布。 除非部署CLI工具或使用发布过程来生产production package,否则不建议这样做。
如果package-lock.json
和npm-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
的情况下执行此操作。