npm @ 5已发布,它具有一个新功能package-lock.json(在npm install之后),这使我感到困惑。我想知道此文件的作用是什么?

#1 楼

它存储了确切的版本化的依赖关系树,而不是使用像package.json本身(例如1.0。*)这样的加星标版本控制。这意味着您可以保证对其他开发人员或产品发行版等的依赖性。它还具有锁定树的机制,但是如果package.json更改,通常会重新生成树。对于npm修改node_modules树或package.json的任何操作,都会自动生成/>package-lock.json。它描述了生成的确切树,因此无论中间依赖项更新如何,后续安装都可以生成相同的树。
该文件旨在提交到源存储库中,并具有多种用途:
描述一个依赖关系树的单一表示,这样可以确保队友,部署和持续集成安装完全相同的依赖关系。
为用户提供了一种“时间旅行”到node_modules先前状态的功能,而无需提交目录本身。
通过可读的源代码控制差异来提高树更改的可见性。
并允许npm跳过以前安装的软件包的重复元数据解析,从而优化安装过程。“

编辑
要回答jrahhali的以下问题,即仅使用具有确切版本号的package.json。请记住,package.json仅包含直接依赖项,而不包含您的依赖项的依赖项(有时称为嵌套依赖项)。这意味着使用标准package.json,您无法控制这些嵌套依赖项的版本,直接引用它们或作为对等依赖项都无济于事,因为您也无法控制直接依赖项为这些嵌套依赖项定义的版本容忍。
即使锁定直接依赖项的版本,您也不能100%保证每次的完全依赖项树都相同。其次,您可能希望允许对直接依赖项进行不间断的更改(基于语义版本控制),这将使您对嵌套依赖项的控制甚至更少,而且您再次无法保证直接依赖项在某些时候不会破坏语义版本控制规则
所有这些的解决方案是锁定文件,如上所述,该文件锁定了完整依赖项树的版本。这使您可以为其他开发人员或发行版保证依赖关系树,同时仍允许使用标准package.json测试新的依赖关系版本(直接或间接)。先前的收缩包装json几乎做了同样的事情,但锁文件将其重命名,以便其功能更加清晰。如果项目中已经有收缩包装文件,则将使用它来代替任何锁定文件。

评论


如果要寻求具有确切版本的依赖关系,为什么不强制在package.json中指定确切版本并放弃package-lock.json文件?

– jrahhali
17年6月9日在16:52

@jrahhali-根据您的问题修改了我的答案。

–马特
17年6月26日在10:27

如何将package.json.lock中的此依赖关系树应用于其他开发人员?自动吗?

–Steve Kbr /> 17年7月20日在11:00

请注意,此答案不再正确!自NPM 5.1起,每次调用npm install时,都会更新package-lock.json文件。 (在github.com/npm/npm/issues/16866中进行更改,在github.com/npm/npm/issues/17979中为示例),因此,除非您指定确切的版本,否则它不再可用于为所有开发人员设置相同的版本就像package.json文件中的1.2.3而不是1.2。*一样。

–基督徒
17年8月18日在9:28



您应该添加对npm ci的引用,因为npm install将更新package-lock.json,而ci使用其内容。只有使用npm ci,您才能获得可重复的强大构建。

–k0pernikus
19/09/10'15:42

#2 楼

对于npm来说,这是一个非常重要的改进:确保每个软件包的版本完全相同。

如何确保在不同的时间,不同的环境中使用相同的程序包构建项目?假设您可以在^1.2.3中使用package.json,或者某些依赖项正在使用这种方式,但是您如何确保每次npm install在您的开发机和构建服务器中都选择相同的版本? package-lock.json将确保。

npm install将重新生成锁定文件,在构建服务器或部署服务器上时,执行npm ci(将从锁定文件中读取并安装整个软件包)树)

评论


请注意,这有点过时了。从5.1.0开始,“ npm install”根本不会从package-lock.json文件中读取。它只是像以前那样从package.json安装。要使用package-lock.json文件,您必须使用新的“ npm ci”命令,它将安装package-lock.json中列出的确切版本,而不是package.json中给出的版本范围。

– Venryx
18年7月20日在2:21



恐怕Venryx是不正确的。 npm install确实从package-lock.json中读取。若要进行复制,请执行以下操作。使用此package.json,运行npm install {...“ devDependencies”:{“ sinon”:“ 7.2.2”}}现在将package.json和package-lock.json复制/粘贴到新目录。将package.json更改为:“ sinon”:“ ^ 7.2.2”运行npm install。 npm从package-lock.json读取并安装7.2.2而不是7.3.0。如果没有package-lock.json,将安装7.3.0。

– zumafra
19 Mar 23 '19在19:45



不仅如此,而且如果您想做一些事情,例如将packaget ^添加到package-lock.json中,唯一可行的方法是删除package-lock.json并使用npm install重新生成。 (您不想手动编辑package-lock.json)。更改package.json的“ version”属性(在顶部附近)的值将在npm安装时更改package-lock.json中的内容,但是将插入符添加到依赖项对package-lock.json不会起到相同作用。

– zumafra
19 Mar 23 '19在20:07



可以将package.json视为可以手动修改的内容,而将package-lock.json视为永不手动触摸的内容。您始终对两个文件进行版本控制-尤其是package-lock.json。打开两个文件,在package.json中手动编辑项目名称,运行npm install并查看package-lock.json中项目名称的变化。许可证似乎没有记录在package-lock.json中。

– zumafra
19-09-4在2:31



在执行npm ci时将使用@zumafra package-lock.json文件,即使提供了锁定文件,npm install也将仅使用package.json

–辛
19-09-4在22:55

#3 楼

当在package-lock.json中更改诸如“ version”属性或从属属性之类的属性中的数值时,将写入package.json

如果package.jsonpackage-lock.json中的这些数值匹配,则从。

如果package-lock.jsonpackage.json中的这些数值不匹配,则将使用这些新值写入package-lock.json,并使用新的修饰符(例如插入符号和代字号)。但这是触发对package-lock.json进行更改的数字。

要了解我的意思,请执行以下操作。使用不带package-lock.jsonpackage.json,运行带有以下命令的package-lock.json

{
  "name": "test",
  "version": "1.0.0",
  ...
  "devDependencies": {
    "sinon": "7.2.2"
  }
}


npm install现在将具有: /将两个文件粘贴到新目录。将package-lock.json更改为(仅添加插入符号):

"sinon": {
  "version": "7.2.2",


运行package.json。如果没有npm install文件,将安装sinon@7.3.0。 package-lock.json正在读取npm install并安装7.2.2。

现在将package-lock.json更改为:

{
  "name": "test",
  "version": "1.0.0",
  ...
  "devDependencies": {
    "sinon": "^7.2.2"
  }
}


运行package.jsonnpm install已被写入,现在将显示:

{
  "name": "test",
  "version": "1.0.0",
  ...
  "devDependencies": {
    "sinon": "^7.3.0"
  }
}


#4 楼

还要提及的一件事是软件包锁定文件附带的安全性改进。如果有人篡改公共npm注册表并更改包的源代码而不更改包本身的版本,则由于它保留了包的所有哈希值,因此包锁定文件会检测到它。

#5 楼

对于npm修改node_modules树或package.json的任何操作,都会自动生成package-lock.json。它描述了生成的确切树,因此无论中间依赖项更新如何,后续安装都可以生成相同的树。
描述了依赖树的单一表示形式,从而确保了队友,部署和持续集成安装完全相同的依赖项。它包含以下属性。
{
    "name": "mobileapp",
    "version": "1.0.0",
    "lockfileVersion": 1,
    "requires": true,
    "dependencies": {
    "@angular-devkit/architect": {
      "version": "0.11.4",
      "resolved": "https://registry.npmjs.org/@angular- devkit/architect/-/architect-0.11.4.tgz",
      "integrity": "sha512-2zi6S9tPlk52vyqNFg==",
      "dev": true,
      "requires": {
        "@angular-devkit/core": "7.1.4",
        "rxjs": "6.3.3"
      }
    },
}       


#6 楼

npm会自动创建并使用此文件,以跟踪您的软件包安装情况,并更好地管理项目依赖项的状态和历史记录。您
不应更改此文件的内容。

评论


那么如果我与此文件发生冲突怎么办?

–奥利弗·沃特金斯(Oliver Watkins)
20-2-25在9:39

#7 楼

package-lock.json:它包含您的应用程序当前安装的确切版本详细信息。

评论


嗨,欢迎光临这个问题已经回答。您必须验证问题是否已标记为已回答,看看是否有任何答案在其前面有绿色提示。

–Néstor
20年6月3日,19:15

@Néstor不要误会。鉴于答案是新的且有用的,因此可以回答已经回答的问题。 (尽管此答案并非如此)。

–西藏人。中号
20-10-17在6:54