npm@5已经发布了,它有一个新的功能package-lock.json
文件(在npm install
之后),这让我很困惑。我想知道,这个文件的效果是什么?
发布于 2017-06-01 11:26:34
它存储了一个精确的、版本化的依赖树,而不是像package.json
本身那样使用星形版本控制(例如1.0.*)。这意味着您可以保证其他开发人员或prod版本等的依赖关系。它还具有锁定树的机制,但通常会在package.json
更改时重新生成。
包--任何npm修改node_modules树或package.json的操作都会自动生成lock.json。它描述了生成的确切树,这样无论中间依赖项更新如何,后续安装都能够生成相同的树。
此文件旨在提交到源代码库中,并用于各种用途:
描述依赖关系树的单一表示,以确保队友、部署和持续集成安装完全相同的依赖关系。
为用户“穿越”到node_modules以前的状态提供了便利,而不必提交目录本身。
通过可读的源代码管理差异来促进树更改的更大可见性。
并通过允许npm跳过以前安装的包的重复元数据解析来优化安装过程。“
编辑
为了回答下面jrahhali关于只使用带有确切版本号的package.json
的问题。请记住,package.json
只包含直接依赖项,而不包含依赖项的依赖项(有时称为嵌套依赖项)。这意味着使用标准package.json
无法控制这些嵌套依赖项的版本,直接引用它们或作为对等依赖项不会有任何帮助,因为您也无法控制直接依赖项为这些嵌套依赖项定义的版本容差。
即使您锁定了直接依赖关系的版本,您也不能100%保证您的完整依赖关系树每次都是相同的。其次,您可能希望允许直接依赖项的非破坏性更改(基于语义版本控制),这会使您对嵌套依赖项的控制更少,而且您也不能保证直接依赖项在某些时候不会违反语义版本控制规则本身。
所有这一切的解决方案是锁文件,如上所述,它在完整依赖关系树的版本中锁定。这允许您保证其他开发人员或版本的依赖关系树,同时仍然允许使用您的标准package.json
测试新的依赖关系版本(直接或间接)。
注意:前面的锁做了几乎相同的事情,但是锁文件重命名了它,这样它的功能就更清晰了。如果项目中已经存在压缩包装文件,则将使用该文件,而不是任何锁定文件。
发布于 2018-06-15 11:33:13
这是对npm的一个非常重要的改进:保证每个包的版本完全相同。
如何确保您的项目在不同的时间在不同的环境中使用相同的包构建?比方说,你可以在你的package.json
中使用^1.2.3
,或者你的一些依赖项正在以这种方式使用,但是你如何确保每次npm install
在你的开发机器和构建服务器中获得相同的版本?
npm install
将重新生成锁定文件。
当在构建服务器或部署服务器上时,执行npm ci
(它将读取锁定文件,并安装整个包树)
发布于 2019-03-24 04:24:44
当在package.json
中更改属性(如"version“属性或依赖项属性)中的数值时,将写入package-lock.json
。
如果package.json
和package-lock.json
中的这些数值匹配,则从中读取package-lock.json
。
如果package.json
和package-lock.json
中的这些数值不匹配,则会使用这些新值和新修饰符(如插入符号和波浪符号)写入package-lock.json
。但正是数字触发了对package-lock.json
的更改。
要理解我的意思,请执行以下操作。在不使用package-lock.json
的情况下使用package.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",
https://stackoverflow.com/questions/44297803
复制相似问题