package.json中代字号(〜)和插入符号(^)之间的区别是什么?

时间:2014-03-12 06:02:22

标签: node.js npm package.json semantic-versioning

升级到最新稳定版nodenpm后,我尝试了npm install moment --save。它使用插入符package.json前缀保存^中的条目。以前,它是一个波浪号~前缀。

  1. 为什么在npm中进行了这些更改?
  2. 代字号~和插入符号^之间有什么区别?
  3. 与其他人相比有什么优势?

19 个答案:

答案 0 :(得分:3275)

  

代字号~匹配指定次要版本(第二个数字)的最新修补程序版本(第三个数字)。
  ~1.2.3将匹配所有1.2.x版本,但将在1.3.0上推迟。

     

插入符^更放松。它匹配   指定主要版本(第一个数字)的最新次要版本(第二个数字)   ^ 1.2.3将匹配   任何1.x.x版本,包括1.3.0,但将在2.0.0推迟。

(这是http://fredkschott.com/post/2014/02/npm-no-longer-defaults-to-tildes/)的修改和更正版本

答案 1 :(得分:738)

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

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

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

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

以上列表并非详尽无遗。其他版本说明符包括GitHub URL和GitHub用户repo,本地路径和具有特定npm标记的包

答案 2 :(得分:468)

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

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

  

semver table

根据:"Semver explained - why there's a caret (^) in my package.json?"

注意规则适用于1.0.0以上的版本,而不是每个项目都遵循语义版本。对于版本0.x.x,插入符号仅允许 patch 更新,即它的行为与波形符相同。见"Caret Ranges"

以下是概念的直观解释:

  

semver diagram

来源:"Semantic Versioning Cheatsheet"

答案 3 :(得分:83)

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

^仅修复主要数字。当您密切关注您的依赖关系时,它会被使用,如果次要版本不兼容,您可以快速更改代码。

除此之外,旧的npm版本^not supported,应谨慎使用。

所以,^是一个很好的默认值,但它并不完美。我建议您仔细挑选并配置对您最有用的semver运算符。

答案 4 :(得分:82)

Semver

<major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2
  • 使用npm semver calculator进行测试。 (虽然对^的解释(包括在同一主要范围内的特定版本以外的所有内容)和〜(包括在同一次要范围内的特定版本以外的所有内容)都不是100%正确,但计算器似乎工作正常)
  • 或者,请改用SemVer Check,这不需要您选择包裹并提供解释。

允许或禁止更改

  • Pin版本:1.2.3
  • 使用^(如头部)。允许从左侧第二个非零级别进行更新:^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级版本!这是因为npm^设置为package.json中的默认值,并且当安装的版本类似于0.1.3时,它会冻结所有主要/次要/补丁级别。

答案 5 :(得分:51)

~:合理地关闭

   ~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

答案 6 :(得分:28)

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

关于semver如何应用于npm的一个很好的阅读this blog post 他们正在做些什么来使它匹配the semver standard
http://blog.npmjs.org/post/98131109725/npm-2-0-0

答案 7 :(得分:27)

可以考虑帽子匹配&#34;破坏&#34;因为它不会将^0.1.2更新为0.2.0。当软件出现时,使用0.x.y版本,并且帽子匹配将仅匹配最后一个变化的数字(y)。这是故意的。原因在于,虽然软件正在发展,但API的变化很快:有一天你有这些方法,有一天你有这些方法而旧的方法已经消失了。如果您不想破坏已经使用您的图书馆的人的代码,您可以增加主要版本:例如: 1.0.0 - &gt; 2.0.0 - &gt; 3.0.0。因此,当您的软件最终100%完成并且功能齐全时,它将类似于版本11.0.0,并且看起来不是很有意义,实际上看起来很混乱。另一方面,如果您使用0.1.x - &gt; 0.2.x - &gt; 0.3.x版本,当软件最终100%完成并且功能齐全时,它将作为版本1.0.0发布,这意味着&#34;此版本是长期服务版本,您可以继续在您的生产代码中使用此版本的库,并且作者明天或下个月都不会改变所有内容,并且他不会放弃该软件包&#34;。

规则是:当您的软件尚未成熟时使用0.x.y版本控制,并在公共API发生变化时通过递增中间数字来释放它(因此^0.1.0赢得了0.2.0的人得到1.0.0更新,它不会破坏他们的代码)。然后,当软件成熟时,将其释放到^1.0.0下,并在每次公开API更改时递增最左边的数字(因此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. 更新,并且赢了& #39;打破他们的代码。)

rid="Vajravelu:1978"

答案 8 :(得分:14)

单线解释

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

npm根据这些字符

检查并修复特定包的版本
  

:主要版本已修复,次要版本已修复,匹配任何内部版本号

e.g。 :~2.4.1表示它将检查2.4.x,其中x是

  

^ :主要版本已修复,匹配任何次要版本,匹配任何内部版本号

e.g。 :^ 2.4.1表示它将检查2.x.x,其中x是

答案 9 :(得分:12)

你可能已经在package.json中看到了波形符(〜)和插入符号(^)。他们之间有什么区别?

当您执行npm install moment --save时,它会使用插入符号(^)保存package.json中的条目。

波浪号(〜)

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

插入符号(^)

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

参考:https://medium.com/@Hardy2151/caret-and-tilde-in-package-json-57f1cbbe347b

答案 10 :(得分:11)

波浪〜与次要版本匹配,如果您已安装具有1.4.2的软件包,则在安装后,如果package.json中也提供了1.4.3和1.4.4版本。用作〜1.4.2,然后在升级后在项目中安装npm,将在项目中安装1.4.4。但是该软件包有1.5.0可用,因此〜不会安装。它称为次要版本。

Caret ^ 与主要版本匹配,如果项目中停滞了1.4.2软件包并且还提供了1.5.0,则^将安装主要版本。如果您具有 ^ 1.4.2 ,则不允许安装2.1.0。

固定版本,如果您不想在每次安装时都更改软件包的版本,则使用不带任何特殊字符的固定版本,例如“ 1.4.2”

最新版本* 如果要安装最新版本,则仅在包名称前使用*。

答案 11 :(得分:7)

〜蒂尔德:

  • ~修复主要和次要数字。
  • 当您准备接受依赖项中的错误修复时使用它 但不要求任何可能不兼容的更改。
  • 代字号与最近的次要版本(中间数字)匹配。
  • ~1.2.3将匹配所有1.2.x版本,但它将错过1.3.0。
  • Tilde(〜)为您提供错误修复发布

^ Caret:

  • ^仅修复主要数字。
  • 当您仔细观察您的依赖关系时,可以使用它,如果次要版本不兼容,您可以快速更改代码。
  • 它会将您更新为最新主要版本(第一个数字)。
  • ^ 1.2.3将匹配包括1.3.0在内的任何1.x.x版本,但它将在2.0.0上推迟。
  • Caret(^)也为您提供向后兼容的新功能。

答案 12 :(得分:5)

Tilde(〜)

  

主要版本已修复,次要版本已修复,匹配任何版本   编号

"express": "~4.13.3" 

~4.13.3表示它将检查4.13.x,其中x是任何东西,4.14.0

Caret(^)

  

主要版本已修复,匹配任何次要版本,匹配任何版本   编号

"supertest": "^3.0.0"

^3.0.0表示它将检查3.x.x,其中x是任何

答案 13 :(得分:4)

semver分为3个主要部分,各部分用点分隔。

major.minor.patch
1.0.0

这些不同的主要,次要和补丁用于标识不同的发行版。 浪潮(〜)和脱字号(^)用于标识在软件包版本控制中使用的次要版本和修补程序版本。

~1.0.1
 Install 1.0.1 or **latest patch versions** such as 1.0.2 ,1.0.5
^1.0.1
 Install 1.0.1 or **latest patch and minor versions** such as 1.0.2 ,1.1.0 ,1.1.1

答案 14 :(得分:3)

版本号的语法表示每个部分的含义不同。语法分为三部分,用点分隔。

major.minor.patch 1.0.2

主要,次要和补丁表示软件包的不同版本。

npm使用波浪号(〜)和插入号(^)分别指定要使用的补丁程序和次要版本。

因此,如果看到〜1.0.2,则意味着安装版本1.0.2或最新的修补程序版本(例如1.0.4)。如果看到^ 1.0.2,则意味着安装版本1.0.2或最新的次要版本或修补程序版本(例如1.1.0)。

答案 15 :(得分:2)

〜指明次要版本发布 ^指定主要版本发布

例如,如果软件包版本是4.5.2,则更新 ~4.5.2将安装最新的4.5.x版本(MINOR VERSION) ^ 4.5.2将安装最新的4.x.x版本(MAJOR VERSION)

答案 16 :(得分:1)

本质上,这不是一个答案,但似乎被忽略了。

克拉范围的描述:

请参阅:https://github.com/npm/node-semver#caret-ranges-123-025-004

Allows changes that do not modify the left-most non-zero digit in the [major, minor, patch] tuple.

表示^10.2.310.2.3 <= v < 20.0.0匹配

我认为那不是他们的意思。从11.x.x到19.x.x插入版本会破坏您的代码。

我认为它们的意思是left most non-zero number field。 SemVer中没有要求数字字段为一位的数字。

答案 17 :(得分:1)

克拉 ^在相同的主要范围内包含比特定版本更大的所有物品。

波浪号 ~在相同的较小范围内包含大于特定版本的所有内容。

例如,要指定可接受的最高版本范围为1.0.4,请使用以下语法:

  • 补丁版本:1.0或1.0.x或〜1.0.4
  • 次要版本:1或1.x或^ 1.0.4
  • 主要版本:*或x

有关语义版本语法的更多信息,请参见npm semver calculator

npm semantic versions in published packages§

npm文档About semantic versioning中的更多内容

答案 18 :(得分:1)

有关此问题,您可以查看Composer documentation on versions,但简而言之:

  • 波浪版本范围()-〜1.2.3等于> = 1.2.3 << strong> 1.3.0
  • Caret版本范围( ^ )-〜1.2.3等于> = 1.2.3 << strong> 2.0.0

因此,通过 Tilde ,您将获得补丁的自动更新,但次要和主要版本将不会更新。但是,如果您使用 Caret ,则将获得补丁程序和次要版本,但不会获得主要(重大更改)版本。

Tilde版本被认为是“更安全”的方法,但是,如果您使用可靠的依赖项(维护良好的库),则Caret版本不会有任何问题(因为较小的更改不应破坏更改。

您可能应该查看this stackoverflow post about differences between composer install and composer update