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

aiazj4mn  于 2023-06-23  发布在  其他
关注(0)|答案(8)|浏览(182)

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

xriantvc

xriantvc1#

它存储了一个精确的、版本化的依赖关系树,而不是像package.json本身那样使用星型版本(例如这意味着您可以保证其他开发人员或产品发布等的依赖性。它也有一个锁定树的机制,但如果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测试新的依赖关系版本(直接或间接)。
注意:以前的npm-shrinkwrap.json做了几乎相同的事情,但锁文件重命名了它,以便它的功能更清晰。如果项目中已经有一个收缩 Package 文件,则将使用该文件而不是任何锁定文件。

编辑2023

从NPM v8.3.0(2021-12-09)开始,package.json有一个属性overrides,它可以帮助你不接触package-lock.json文件。

{
  "overrides": {
    "foo": "1.0.0"
  }
}

https://docs.npmjs.com/cli/v9/configuring-npm/package-json#overrides

dffbzjpn

dffbzjpn2#

这是对npm的一个非常重要的改进:保证每个包的版本完全相同
如何确保您的项目在不同的时间在不同的环境中使用相同的包构建?比如说,你可以在你的package.json中使用^1.2.3,或者你的一些依赖项正在使用这种方式,但是你如何确保每次npm install在你的开发机器和构建服务器中都会选择相同的版本呢?package-lock.json将确保这一点。
npm install将重新生成锁文件。
在构建服务器或部署服务器上执行npm ci
(它将从锁文件中读取,并安装整个包树)

mspsb9vt

mspsb9vt3#

package-lock.jsonpackage.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",
9cbw7uwe

9cbw7uwe4#

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

lh80um4z

lh80um4z5#

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

rryofs0p

rryofs0p6#

package-lock.json文件的目标是跟踪安装的每个软件包的确切版本,以便即使软件包由其维护者更新,产品也可以以相同的方式100%重现。
这解决了package.json未解决的一个非常具体的问题。在package.json中,您可以使用semver表示法设置您想要升级到的版本(patch或minor)。

ryevplcw

ryevplcw7#

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

9wbgstp7

9wbgstp78#

Package.json文件包含您安装的包和库的主要名称,您可以编辑它,但Package-lock.json包含每个包的详细信息和每个包的存储库链接(认为它是来自package.json的包的详细信息)参考
https://web-brackets.com/discussion/69/what-is-the-use-of-package-lock-json-file

相关问题