package.json 中的 tilde(〜)和 caret(^)有什么区别?

升级到最新的稳定nodenpm ,我尝试了npm install moment --save 。它将条目以尖号^保存在package.json 。以前,它是一个波浪号~前缀。

  1. 为什么在npm进行这些更改?
  2. 是什么波浪之间的区别~和尖^
  3. 与其他相比有什么优势?

答案

查看NPM 文档

〜version“大约等同于版本” 将把您更新到下一个补丁程序版本。参见semver 。 〜1.2.3 将使用从 1.2.3 到 < 1.3.0 的发行版。

^ version 将您更新到下一个次要版本。参见semver^2.3.4将使用 3.0.0 以下的发行版。请参阅下面的评论。

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

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

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

  • ~version “约相当于版本” 见NPM semver - 波浪号范围semver(7)
  • ^version “与版本兼容” 参见npm semver - 插入符号范围semver(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,插入记号仅允许更新修补程序,即,其行为与代字号相同。请参阅“范围”

这是概念的直观说明:

semver图

来源: “语义版本控制速查表”

森弗

<major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2
  • 使用npm semver 计算器进行测试。 (尽管对 ^(包括在相同主范围内大于特定版本的所有内容)和〜(包括在相同主范围内大于特定版本的所有内容)的解释并不是 100%正确,但计算器似乎可以正常工作)
  • 另外,也可以改用SemVer Check ,它不需要您选择软件包,还提供了说明。

允许或禁止更改

  • 引脚版本: 1.2.3
  • 使用^ (例如 head)。允许从左数第二个非零级别进行更新: ^0.2.3表示0.2.3 <= v < 0.3
  • 使用~ (如尾巴)。通常冻结最右边的级别,如果省略则设置为零:
    • ~1表示1.0.0 <= v < 2.0.0
    • ~1.2表示1.2.0 <= v < 1.3.0
    • ~1.2.4表示1.2.4 <= v < 1.3.0
  • 省略最右边的水平: 0.2表示0.2 <= v < 1 。与~不同,因为:
    • 开始省略的级别版本始终为0
    • 您可以设置起始主要版本,而无需指定子级别。

所有(希望)可能性

设置开始专业水平并允许向上更新

*  or "(empty string)   any version
1                         v >= 1

冻结专业

~0 (0)            0.0 <= v < 1
0.2               0.2 <= v < 1          // Can't do that with ^ or ~ 
~1 (1, ^1)        1 <= v < 2
^1.2              1.2 <= v < 2
^1.2.3            1.2.3 <= v < 2
^1.2.3-beta.4     1.2.3-beta.4 <= v < 2

冻结次要级别

^0.0 (0.0)        0 <= v < 0.1
~0.2              0.2 <= v < 0.3
~1.2              1.2 <= v < 1.3
~0.2.3 (^0.2.3)   0.2.3 <= v < 0.3
~1.2.3            1.2.3 <= v < 1.3

冻结补丁程序级别

~1.2.3-beta.4     1.2.3-beta.4 <= v < 1.2.4 (only beta or pr allowed)
^0.0.3-beta       0.0.3-beta.0 <= v < 0.0.4 or 0.0.3-pr.0 <= v < 0.0.4 (only beta or pr allowed)
^0.0.3-beta.4     0.0.3-beta.4 <= v < 0.0.4 or 0.0.3-pr.4 <= v < 0.0.4 (only beta or pr allowed)

禁止更新

1.2.3             1.2.3
^0.0.3 (0.0.3)    0.0.3

注意事项 :缺少主要,次要,补丁或指定beta没有数,相同any失踪的水平。

注意 :安装主要级别为0的软件包时,更新将仅安装新的 beta / pr 级别版本!这是因为npmpackage.json中将^设置为默认值,并且当安装的版本为0.1.3 ,它将冻结所有主要 / 次要 / 补丁程序级别。

~修正主要和次要数字。当您准备接受依赖项中的错误修复但不希望任何潜在的不兼容更改时,可以使用它。

^仅固定主号码。当您密切关注依赖关系并准备好在次要版本不兼容时准备快速更改代码时,可以使用它。

除此之外,旧的 npm 版本不支持 ^ ,因此应谨慎使用。

因此, ^是一个很好的默认值,但不是完美的。我建议仔细选择和配置对您最有用的 semver 运算符。

~ :合理接近

~1.1.5: 1.1.0 <= accepted < 1.2.0

^兼容

^1.1.5: 1.1.5 <= accepted < 2.0.0

   ^0.1.3: 0.1.3 <= accepted < 0.2.0

   ^0.0.4: 0.0.4 <= accepted < 0.1.0

^为 1. [any]。[any](最新的次要版本)
~是 1.2。[any](最新补丁)

这篇博文很好地介绍了 semver 如何应用于 npm
以及他们正在做些什么来使其符合semver 标准
http://blog.npmjs.org/post/98131109725/npm-2-0-0

帽子匹配可能被认为是 “残破的”,因为它不会将^0.1.2更新为0.2.0 。当软件出现时,请使用0.xy版本,并且帽子匹配将仅匹配最后一个变化的数字( y )。这是有目的的。原因是,随着软件的发展,API 迅速变化:有一天,您拥有了这些方法,而另一天,您拥有了这些方法,而旧的方法就不复存在了。如果您不想破坏已经在使用您的库的人的代码,则可以增加主要版本:例如1.0.0 > 2.0.0 > 3.0.0 。因此,等到您的软件终于 100%完成并具有完整功能时,它就会像11.0.0版一样,这看起来没有什么意义,实际上看起来很混乱。如果你是,在另一方面,使用0.1.x - > 0.2.x - > 0.3.x版本,然后由当时的软件终于 100%完成,功能齐全的它被释放版本1.0.0 ,这意味着 “此发行版是一项长期服务,您可以在生产代码中继续使用此版本的库,并且作者明天或下个月都不会更改所有内容,并且他不会放弃该软件包。”

规则是:当您的软件尚未成熟时,请使用0.xy版本控制;当您的公共 API 更改时,请以中间数字递增的方式发布它(因此,拥有^0.1.0将不会获得0.2.0更新,而它会破坏他们的代码)。然后,当软件成熟时,在公共 API 每次更改时在1.0.0下发布并递增最左边的数字(因此拥有^1.0.0将无法获得2.0.0更新,并且不会破坏其代码)。

Given a version number MAJOR.MINOR.PATCH, increment the:

MAJOR version when you make incompatible API changes,
MINOR version when you add functionality in a backwards-compatible manner, and
PATCH version when you make backwards-compatible bug fixes.

〜蒂尔德:

  • ~冻结大号和小号。
  • 当您准备接受依赖项中的错误修复但不希望任何潜在的不兼容更改时,可以使用它。
  • 代字号与最新的次要版本 (中间编号)匹配。
  • 〜1.2.3 将与所有 1.2.x 版本匹配,但将错过 1.3.0。
  • Tilde(〜)为您提供错误修复版本

^ 脱字号:

  • ^仅冻结主号码。
  • 当您密切关注依赖关系并准备好在次要版本不兼容时准备快速更改代码时,可以使用它。
  • 它将把您更新到最新的主要版本 (第一个数字)。
  • ^ 1.2.3 将与任何 1.xx 版本(包括 1.3.0)匹配,但将在 2.0.0 版本上生效。
  • 脱字号(^)也为您提供了向后兼容的新功能。

一班班轮说明

标准版本控制系统是 major.minor.build(例如 2.4.1)

npm 根据这些字符检查并修复特定软件包的版本

:主版本是固定的,次版本是固定的,匹配任何内部版本号

例如:〜2.4.1 表示它将检查 2.4.x,其中 x 为任意值

^ :主要版本是固定的,与任何次要版本匹配,与任何内部版本号匹配

例如:^ 2.4.1 表示它将检查 2.xx,其中 x 为任意值