package.json更新标记的工作原理(在幕后)

时间:2019-04-08 21:54:20

标签: node.js npm package.json

我正在尝试了解package.json更新过程的工作方式。例如:

"dependencies": {
 "express": "^4.16.4",
},

在这种情况下,我的Express带有减号^,仅适用于4.X.X更新。这很清楚。但是,此更新究竟如何工作?我的意思是,如果我在第一次安装(下载了新的Express版本)之后的1个星期下载了node_module文件夹(和package-lock.json),就下载该版本吗? 4.16.4或(例如)4.17.0?我认为4.17.0,但package.json仍然保留在4.16.4(文本描述)中,并且更新报告在package-lock.json或其他内容中?我从未在package.json中看到数字变化。

对此我感到很困惑。

有时,当我从其文件夹中检查某个模块时,我会从package.json中看到不同的版本。为什么?

1 个答案:

答案 0 :(得分:1)

插入符号(^)将更新为最近的主要版本(第一个数字)。 ^4.16.4将与任何4.x.x版本(包括4.17.x)匹配,但将推迟更新到5.0.0.版本Express的版本,因为这是一个重大的发行版,更改为Express库。

关于您的问题:“如果我要在首次安装node_modules后一周删除package-lock.json目录和Express文件,然后说一个新的{{1} }版本已在该时间范围内发布。我将下载哪个版本的Express

这取决于最新版本是主要次要还是补丁。如果最新版本是次要版本或补丁程序发行版:第二个或第三个数字已更改,则 npm将安装最新的4.x.x。 Express版本。在您的特定示例场景中,是的,它将安装Express V4.17.0 。您还正确地认为Express仍将package.json列为构建项目的必要依赖项。如前所述,这是因为插入符号的工作方式:获取最新的4.x.x。 "express: "^4.16.4" 的版本。无需将Express中的Express列表更新为最新版本,因为胡萝卜会帮您解决这个问题。如果您考虑一下,那将是一个非常不错的功能,因为另一种选择是手动指定每个新版本,即使它只是次要版本或修补程序版本。而且没有人有时间……除非是主要版本。

此外,由于最新的package.json版本不是主要版本,即Express的第一个数字没有变化,因此没有“重大变化”,因此抓取最新版本通常是安全的。话虽如此,如果需要,您可以指定任何依赖项的确切版本。至于Semver文件,此文件有点像您的当前配置和构建依赖项的“ 快照”。因此,当您进行影响项目构建的更改时,此文件将更新:即添加新的依赖项或更新现有的版本。。这是因为此文件应为“真理之源” ,以防其他人想复制您的项目并有可能为此做贡献。

希望有帮助!