【问题标题】:how exactly package.json update flag work (under the hoods)package.json 更新标志究竟是如何工作的(在幕后)
【发布时间】:2019-04-09 07:55:24
【问题描述】:

我正在尝试了解 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 不同的版本。为什么?

【问题讨论】:

  • 我的回答有意义吗?

标签: node.js npm package.json


【解决方案1】:

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

至于你的问题:“如果我在第一次安装 Express 一周后删除 node_modules 目录和 package-lock.json 文件,并说在那个时间范围内发布了一个新的 Express 版本。我会下载哪个版本的Express

这取决于最新版本是主要次要还是补丁版本。如果最新版本是次要版本或补丁版本:第二个或第三个数字更改,那么 npm 将安装最新的 4.x.x。 Express 版本。 在您的特定示例场景中,是的,它将安装 Express V4.17.0。您也正确的是,package.json 仍会将"express: "^4.16.4" 列为构建项目的必要依赖项。这是因为 caret 的工作原理,如前所述:获取最新的 4.x.x。 Express 的版本。无需将package.json 中的Express 列表更新为最新版本,因为胡萝卜会为您处理。如果您考虑一下,这是一个非常好的功能,因为替代方法是手动指定每个新版本发布,即使它只是次要版本或补丁版本。没有人有时间去做...除非它是主要版本。

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

希望对您有所帮助!

【讨论】:

    猜你喜欢
    • 2011-06-26
    • 2021-08-15
    • 2012-06-08
    • 2011-10-11
    • 2013-07-05
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    • 2011-06-01
    相关资源
    最近更新 更多