package-lock.json的作用是什么?

时间:2017-06-01 03:01:51

标签: npm

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

8 个答案:

答案 0 :(得分:148)

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

来自the npm docs

  对于npm修改node_modules树或package.json的任何操作,都会自动生成

package-lock.json。它描述了生成的确切树,以便后续安装能够生成相同的树,无论中间依赖性更新如何。

     

此文件旨在提交到源存储库中,并用于各种目的:

     

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

     

为用户提供一种“时间旅行”到node_modules之前状态的工具,而无需提交目录本身。

     

通过可读的源代码控制差异来提高树更改的可见性。

     

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

修改

回答jrahhali的问题,关于将package.json与确切的版本号一起使用。请记住,package.json仅包含直接依赖项,而不包含依赖项的依赖项(有时称为嵌套依赖项)。这意味着使用标准的package.json,您无法控制这些嵌套依赖项的版本,直接引用它们或因为对等依赖项无法帮助,因为您也无法控制直接依赖项为这些嵌套依赖项定义的版本容差

即使您锁定了直接依赖项的版本,也无法100%保证每次完整依赖关系树都是相同的。其次,您可能希望允许直接依赖项的非中断更改(基于语义版本控制),这使您对嵌套依赖项的控制更少,再次无法保证您的直接依赖项在某些时候不会破坏语义版本控制规则自己。

所有这一切的解决方案是锁定文件,如上所述锁定完整依赖关系树的版本。这允许您为其他开发人员或版本保证您的依赖关系树,同时仍然允许使用您的标准package.json测试新的依赖版本(直接或间接)。

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

答案 1 :(得分:7)

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

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

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

答案 2 :(得分:5)

还有一件重要的事情要提到的是package-lock文件所带来的安全性改进。如果有人篡改公共npm注册表并更改软件包的源代码,甚至不更改软件包本身的版本,由于它保留了软件包的所有哈希值,因此它将被软件包锁定文件检测到。

答案 3 :(得分:2)

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

答案 4 :(得分:1)

package-lock.json会在package.json中更改“ version”属性或从属属性之类的属性中的数值时写入。

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

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

要了解我的意思,请执行以下操作。在不使用package.json的情况下使用package-lock.json,使用以下命令运行npm install

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

package-lock.json现在将具有:

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

现在将两个文件复制/粘贴到新目录。将package.json更改为(仅添加插入符号):

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

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

现在将package.json更改为:

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

运行npm installpackage-lock.json写入,现在将显示:

"sinon": {
  "version": "^7.3.0",

答案 5 :(得分:1)

package-lock.json是为npm修改node_modules树或package.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 :(得分:1)

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

答案 7 :(得分:1)

package-lock.json 文件的目标是跟踪安装的每个软件包的确切版本,以便即使软件包由其维护者更新,产品也能以相同的方式 100% 重现。

这解决了package.json未解决的一个非常具体的问题。在 package.json 中,您可以使用 semver 表示法设置要升级到的版本(补丁或次要)。