我正在尝试了解package.json更新过程的工作原理。例如:
"dependencies": {
"express": "^4.16.4",
},
在这种情况下,我使用减号标志^
表示只有4.X.X更新。这很清楚。但究竟这个更新如何工作?我的意思是,如果我删除node_module
文件夹(和package-lock.json)第一次安装后1周(和一个新的Express版本发布)我下载的版本? 4.16.4或(例如)4.17.0?我认为4.17.0但是package.json仍然保留在4.16.4(文本描述)中,并且更新是在package-lock.json或其他内容中报告的?我从未见过package.json中的数字发生了变化。
我对此非常困惑。
有时,当我从他们的文件夹中检查一些模块时,我会看到与package.json不同的版本。为什么?
插入符号(^)将更新为最新的主要版本(第一个数字)。 ^4.16.4
将匹配任何4.x.x
发布,包括4.17.x
,但将推迟更新到5.0.0.
版本Express
版本,因为这是一个重大版本,对Express
库有重大改变。
至于你的问题:“如果我在首次安装node_modules
一周后删除package-lock.json
目录和Express
文件,并说在那段时间内发布了新的Express
版本。我会下载哪个版本的Express
?
这取决于最新版本是主要版本,次要版本还是补丁版本。如果最新版本是次要版本或补丁版本:第二次或第三次更改,则npm将安装最新的4.x.x. Express
版本。在您的具体示例场景中,是的,它将安装Express
V4.17.0。你也是正确的,package.json
仍然会将"express: "^4.16.4"
列为构建项目的必要依赖项。这是因为插入符号如何工作,如前所述:获取最新的4.x.x. Express
的版本。没有必要将Express
中的package.json
列表更新到最新版本,因为胡萝卜会为您处理。如果您考虑一下,这是一个非常好的功能,因为替代方案是手动指定每个新版本,即使它只是次要版本或补丁版本。没有人有时间......除非是主要的释放。
此外,由于最新的Express
版本不是主要版本,即你的Semver
的第一个数字没有改变,没有“突破性的变化”,所以通常只能抓住最新版本。但是,如果需要,您可以指定任何依赖项的确切版本。对于package-lock.json
文件,此文件有点像当前配置和构建依赖项的“快照”。因此,当您进行影响项目构建的更改时,此文件将更新:即添加新依赖项或更新现有版本。这是因为这个文件应该是其他人的“真相来源”,以防他们想要复制你的项目并可能对它做出贡献。
希望这有帮助!