npm@5已经发布了,它有一个新的特性**package-lock.json**文件(在npm install之后),这让我很困惑。我想知道,这个文件有什么效果?
package-lock.json
npm install
xriantvc1#
它存储了一个精确的、版本化的依赖关系树,而不是像package.json本身那样使用星型版本(例如这意味着您可以保证其他开发人员或产品发布等的依赖性。它也有一个锁定树的机制,但如果package.json发生变化,通常会重新生成树。the npm docs:对于npm修改node_modules树或package.json的任何操作,都会自动生成package-lock.json。它描述了生成的确切树,以便后续安装能够生成相同的树,而不管中间依赖项更新。此文件旨在提交到源存储库中,并用于各种目的:描述依赖关系树的单一表示,以便确保队友、部署和持续集成安装完全相同的依赖关系。为用户提供一个工具,使其可以“时间旅行”到node_modules的先前状态,而不必提交目录本身。通过可读的源代码管理差异来促进树更改的更大可见性。并通过允许npm跳过先前安装的包的重复元数据解析来优化安装过程。”
package.json
为了回答jrahhali下面关于只使用具有确切版本号的package.json的问题。请记住,package.json只包含直接依赖项,而不包含依赖项的依赖项(有时称为嵌套依赖项)。这意味着使用标准的package.json,你不能控制这些嵌套依赖的版本,直接引用它们或作为对等依赖将不会有帮助,因为你也不能控制你的直接依赖为这些嵌套依赖定义的版本容差。即使您锁定了直接依赖项的版本,您也不能100%保证完整的依赖项树每次都是相同的。其次,您可能希望允许直接依赖项的非破坏性更改(基于语义版本控制),这会让您对嵌套依赖项的控制更少,而且您也不能保证直接依赖项不会在某个时候破坏语义版本控制规则本身。所有这一切的解决方案是锁文件,如上所述,它锁定完整依赖关系树的版本。这允许你保证你的依赖关系树为其他开发者或版本,同时仍然允许使用你的标准package.json测试新的依赖关系版本(直接或间接)。注意:以前的npm-shrinkwrap.json做了几乎相同的事情,但锁文件重命名了它,以便它的功能更清晰。如果项目中已经有一个收缩 Package 文件,则将使用该文件而不是任何锁定文件。
npm-shrinkwrap.json
从NPM v8.3.0(2021-12-09)开始,package.json有一个属性overrides,它可以帮助你不接触package-lock.json文件。
overrides
{ "overrides": { "foo": "1.0.0" } }
https://docs.npmjs.com/cli/v9/configuring-npm/package-json#overrides
dffbzjpn2#
这是对npm的一个非常重要的改进:保证每个包的版本完全相同。如何确保您的项目在不同的时间在不同的环境中使用相同的包构建?比如说,你可以在你的package.json中使用^1.2.3,或者你的一些依赖项正在使用这种方式,但是你如何确保每次npm install在你的开发机器和构建服务器中都会选择相同的版本呢?package-lock.json将确保这一点。npm install将重新生成锁文件。在构建服务器或部署服务器上执行npm ci(它将从锁文件中读取,并安装整个包树)
^1.2.3
npm ci
mspsb9vt3#
package-lock.json在package.json中的属性(如“version”属性)或依赖项属性中的数值更改时写入。如果package.json和package-lock.json中的这些数值匹配,则从package-lock.json读取。如果package.json和package-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 install。package-lock.json已写入,现在将显示:
"sinon": { "version": "^7.3.0",
9cbw7uwe4#
还有一件重要的事情要提,那就是包锁文件带来的安全性改进。由于它保留了包的所有哈希值,如果有人篡改公共npm注册表并更改包的源代码,甚至没有更改包本身的版本,它将被package-lock文件检测到。
lh80um4z5#
npm会自动创建并使用这个文件来跟踪您的包安装情况,并更好地管理项目依赖项的状态和历史记录。你不应该改变这个文件的内容。
rryofs0p6#
package-lock.json文件的目标是跟踪安装的每个软件包的确切版本,以便即使软件包由其维护者更新,产品也可以以相同的方式100%重现。这解决了package.json未解决的一个非常具体的问题。在package.json中,您可以使用semver表示法设置您想要升级到的版本(patch或minor)。
ryevplcw7#
package-lock.json:它包含当前为您的应用程序安装的确切版本详细信息。
9wbgstp78#
Package.json文件包含您安装的包和库的主要名称,您可以编辑它,但Package-lock.json包含每个包的详细信息和每个包的存储库链接(认为它是来自package.json的包的详细信息)参考https://web-brackets.com/discussion/69/what-is-the-use-of-package-lock-json-file
8条答案
按热度按时间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
文件。https://docs.npmjs.com/cli/v9/configuring-npm/package-json#overrides
dffbzjpn2#
这是对npm的一个非常重要的改进:保证每个包的版本完全相同。
如何确保您的项目在不同的时间在不同的环境中使用相同的包构建?比如说,你可以在你的
package.json
中使用^1.2.3
,或者你的一些依赖项正在使用这种方式,但是你如何确保每次npm install
在你的开发机器和构建服务器中都会选择相同的版本呢?package-lock.json将确保这一点。npm install
将重新生成锁文件。在构建服务器或部署服务器上执行
npm ci
(它将从锁文件中读取,并安装整个包树)
mspsb9vt3#
package-lock.json
在package.json
中的属性(如“version”属性)或依赖项属性中的数值更改时写入。如果
package.json
和package-lock.json
中的这些数值匹配,则从package-lock.json
读取。如果
package.json
和package-lock.json
中的这些数值不匹配,则将这些新值写入package-lock.json
,并添加新的修饰符,如插入符号和波浪号(如果存在)。但正是这个数字触发了package-lock.json
的变化。要明白我的意思,请做以下操作。使用
package.json
而不使用package-lock.json
,运行npm install
,其中:package-lock.json
现在将具有:现在将两个文件复制/粘贴到一个新目录。将
package.json
更改为(仅添加插入符号):运行
npm install
。如果没有package-lock.json
文件,则安装sinon@7.3.0。npm install
正在读取package-lock.json
并安装7.2.2。现在将
package.json
更改为:运行
npm install
。package-lock.json
已写入,现在将显示:9cbw7uwe4#
还有一件重要的事情要提,那就是包锁文件带来的安全性改进。由于它保留了包的所有哈希值,如果有人篡改公共npm注册表并更改包的源代码,甚至没有更改包本身的版本,它将被package-lock文件检测到。
lh80um4z5#
npm会自动创建并使用这个文件来跟踪您的包安装情况,并更好地管理项目依赖项的状态和历史记录。你不应该改变这个文件的内容。
rryofs0p6#
package-lock.json
文件的目标是跟踪安装的每个软件包的确切版本,以便即使软件包由其维护者更新,产品也可以以相同的方式100%重现。这解决了
package.json
未解决的一个非常具体的问题。在package.json中,您可以使用semver表示法设置您想要升级到的版本(patch或minor)。ryevplcw7#
package-lock.json
:它包含当前为您的应用程序安装的确切版本详细信息。9wbgstp78#
Package.json文件包含您安装的包和库的主要名称,您可以编辑它,但Package-lock.json包含每个包的详细信息和每个包的存储库链接(认为它是来自package.json的包的详细信息)参考
https://web-brackets.com/discussion/69/what-is-the-use-of-package-lock-json-file