首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >包-lock.json的作用是什么?

包-lock.json的作用是什么?
EN

Stack Overflow用户
提问于 2017-06-01 11:01:51
回答 9查看 216.2K关注 0票数 426

npm@5已经发布了,它有一个新的功能package-lock.json文件(在npm install之后),这让我很困惑。我想知道,这个文件的效果是什么?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2017-06-01 11:26:34

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

来自the npm docs

包--任何npm修改node_modules树或package.json的操作都会自动生成lock.json。它描述了生成的确切树,这样无论中间依赖项更新如何,后续安装都能够生成相同的树。

此文件旨在提交到源代码库中,并用于各种用途:

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

为用户“穿越”到node_modules以前的状态提供了便利,而不必提交目录本身。

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

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

编辑

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

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

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

注意:前面的锁做了几乎相同的事情,但是锁文件重命名了它,这样它的功能就更清晰了。如果项目中已经存在压缩包装文件,则将使用该文件,而不是任何锁定文件。

票数 406
EN

Stack Overflow用户

发布于 2018-06-15 11:33:13

这是对npm的一个非常重要的改进:保证每个包的版本完全相同。

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

npm install将重新生成锁定文件。

当在构建服务器或部署服务器上时,执行npm ci

(它将读取锁定文件,并安装整个包树)

票数 69
EN

Stack Overflow用户

发布于 2019-03-24 04:24:44

当在package.json中更改属性(如"version“属性或依赖项属性)中的数值时,将写入package-lock.json

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

如果package.jsonpackage-lock.json中的这些数值不匹配,则会使用这些新值和新修饰符(如插入符号和波浪符号)写入package-lock.json。但正是数字触发了对package-lock.json的更改。

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

代码语言:javascript
复制
{
  "name": "test",
  "version": "1.0.0",
  ...
  "devDependencies": {
    "sinon": "7.2.2"
  }
}

package-lock.json现在将拥有:

代码语言:javascript
复制
"sinon": {
  "version": "7.2.2",

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

代码语言:javascript
复制
{
  "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更改为:

代码语言:javascript
复制
{
  "name": "test",
  "version": "1.0.0",
  ...
  "devDependencies": {
    "sinon": "^7.3.0"
  }
}

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

代码语言:javascript
复制
"sinon": {
  "version": "^7.3.0",
票数 33
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44297803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档