协慌网

登录 贡献 社区

package.json 中的 tilde(〜)和插入符号(^)有什么区别?

在我升级到最新的稳定nodenpm ,我尝试了npm install moment --save 。它使用caret(^)前缀保存package.json的条目。以前,它是一个tilde(~)前缀。

  1. 为什么这些更改是在npm
  2. tilde(~)caret(^)什么区别?
  3. 有什么优势比其他人好?

答案

用最简单的术语来说,代字号与最近的次要版本(中间数字)匹配。 ~1.2.3 将匹配所有 1.2.x 版本,但将错过 1.3.0。

另一方面,插入符号更放松。它会将您更新为最新的主要版本(第一个数字)。 ^ 1.2.3 将匹配任何 1.xx 版本,包括 1.3.0,但将在 2.0.0 推迟。

http://fredkschott.com/post/2014/02/npm-no-longer-defaults-to-tildes/

请注意,作者的术语有些误导:当他说 “最近的次要版本” 时,他的意思是 “指定次要版本中最新的补丁版本”。类似地,对于 ^,“最新的主要版本” 应该被理解为 “指定主要版本中的最新次要版本”。

我想添加官方的 npmjs 文档,其中描述了版本特异性的所有方法,包括问题中提到的方法 -

https://docs.npmjs.com/files/package.json

https://docs.npmjs.com/misc/semver#x-ranges-12x-1x-12-

  • ~version “大致相当于版本” 参见npm semver - Tilde Rangessemver(7)
  • ^version “与版本兼容” 参见npm semver - Caret Rangessemver(7)
  • version必须与版本完全匹配
  • >version必须大于版本
  • >=version
  • <version
  • <=version
  • 1.2.x 1.2.0,1.2.1 等,但不是 1.3.0
  • http://sometarballurl (这可能是将在本地下载和安装的 tarball 的 URL
  • *匹配任何版本
  • latest获得最新版本

以上列表并非详尽无遗。其他版本说明符包括 GitHub 网址和 GitHub 用户存储库,本地路径和包含特定 npm 标记的包

Npm 允许安装比指定版本更新的软件包版本。使用波浪号( ~ )为您提供错误修复版本,而插入符号( ^ )也为您提供向后兼容的新功能。

问题是旧版本通常不会收到错误修复,所以 npm 使用插入符号( ^ )作为--save的默认值。

semver表

根据: “Semver 解释 - 为什么我的 package.json 中有一个插入符号(^)?”

请注意 ,规则适用于 1.0.0 以上的版本,并非每个项目都遵循语义版本控制。对于 0.xx 版本,插入符号仅允许修补程序更新,即它的行为与代字号相同。见“Caret Ranges”

以下是概念的直观解释:

semver图

来源: “语义版本 Cheatsheet”