package-lock.json的角色是什么?

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

282223 次浏览

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

NPM文档:

package-lock。当NPM修改node_modules树或package.json时,Json会自动生成。它描述了生成的确切的树,以便后续安装能够生成相同的树,而不考虑中间依赖项更新。

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

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

为用户提供“时间旅行”的便利;到node_modules之前的状态,而不必提交目录本身。

通过可读的源代码控制差异促进树变化的更大可见性。

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

编辑

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

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

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

NB。之前的npm-shrinkwrap.json做了几乎相同的事情,但锁文件重命名它,以便它的功能更清楚。如果项目中已经有收缩包装文件,则将使用此文件而不是任何锁定文件。

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

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

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

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

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

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

要明白我的意思,请执行以下操作。使用没有package-lock.jsonpackage.json,运行带有npm installnpm 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 install运行。package-lock.json已经是写入,现在将显示:

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

还有一件重要的事情需要提及,那就是包锁文件带来的安全性改进。因为它保存了所有包的哈希值,如果有人篡改了公共npm注册表,甚至没有改变包本身的版本就改变了包的源代码,包锁文件就会检测到。

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

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

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

这解决了__abc0未解决的一个非常具体的问题。在包中。Json,你可以设置你想升级到哪个版本(补丁或小),使用semver符号。

包中。Json文件包含包的主要名称&你安装的库,你可以编辑它,但是包锁。json包含每个包的详细信息和每个包的存储库链接(考虑它是来自package.json的包的详细信息)引用

https://web-brackets.com/discussion/69/what-is-the-use-of-package-lock-json-file