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

在我升级到最新的稳定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.3.0在内的任何1.xx版本,但会在2.0.0版本上延期。

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

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

https://www.npmjs.org/doc/files/package.json.html

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

  • ~version “大致相当于版本”请参阅npm semver – Tilde范围 & 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获得最新版本

以上列表并不详尽。 其他版本说明符包括GitHuburl和GitHub用户回购,具有特定npm标签的本地path和包

Npm允许安装比指定的更新版本的软件包。 使用波浪号(〜)可以为您提供错误修复版本和插入符号(^),以及向后兼容的新function。

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

semver表

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

请注意,这些规则适用于1.0.0以上的版本,并不是每个项目都遵循语义版本控制。

以下是对这些概念的视觉解释:

semver图

资料来源: “Semantic Versioning Cheatsheet” 。

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

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

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

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

Semver

 <major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2 
  • 使用npm semver计算器进行testing。 (虽然对^的解释(包括大于同一主要范围内的特定版本的所有内容)和〜(包括大于相同次要范围内的特定版本的所有内容)不是100%正确的,但计算器似乎工作正常)
  • 或者,使用SemVer Check ,而不要求您select一个包并提供解释。

允许或禁止更改

  • 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
  • ommit最右边的等级: 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 

注意 :缺less主要的,次要的,补丁或指定没有编号的beta ,与缺less的级别相同。

注意 :当你安装包含0作为主要级别的pakckage时,update只会安装新的beta / pr级别的版本! 这是因为npmpackage.json中将^设置为默认值,当安装的版本类似于0.1.3 ,它将冻结所有主要/次要/补丁级别。

~ :相当接近

  ~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. [任何]。[任何](最新次要版本)
~是1.2。[任何](最新补丁)

这篇博文是关于如何将semver应用于npm的
以及他们在做什么来使其符合semver标准
http://blog.npmjs.org/post/98131109725/npm-2-0-0

帽子匹配可能被认为是“破”,因为它不会更新^0.1.20.2.0 。 当软件出现时使用0.xy版本和帽子匹配将只匹配最后变化的数字( y )。 这是有目的的完成的。 原因是,软件在快速发展的同时,API也发生了变化:有一天你有了这些方法,而有一天你有了这些方法,而旧的方法不见了。 如果你不想破坏已经使用你的库的人的代码,你可以增加主要的版本:例如1.0.0 – > 2.0.0 – > 3.0.0 。 所以,当你的软件终于100%完成并且function全面的时候,它就像版本11.0.0一样,看起来并不太有意义,而且看起来很混乱。 另一方面,如果你使用的是0.1.x – > 0.2.x – > 0.3.x版本,那么到软件终于100%完成并且function全面的时候,它就会以版本1.0.0forms发布, “这个版本是一个长期的服务,你可以在你的生产代码中继续使用这个版本的库,作者明天或者下个月不会改变一切,他不会放弃这个包。”

规则是:当你的软件尚未成熟时使用0.xy版本化,当你的公开API发生变化时增加中间数字来释放它(因此有^0.1.0人不会得到0.2.0更新,不要打破他们的代码)。 然后,当软件成熟时,在1.0.0下释放它,每当公共API改变时增加最左边的数字(因此拥有^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. 

一个class轮解释

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

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

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

例如:〜2.4.1意味着它将检查2.4.x,其中x是任何东西

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

例如:^ 2.4.1表示它将检查2.xx,其中x是任何东西

〜蒂尔德:

  • 修正主要和次要的数字。
  • 当您准备好接受依赖项中的错误修复时,会使用它,但不希望发生任何可能不兼容的更改。
  • 代字符与最新的次要版本 (中间数字)匹配。
  • 〜1.2.3会匹配所有的1.2.x版本,但是会错过1.3.0。
  • Tilde(〜)给你错误修复版本

^插入符号:

  • ^修正主号码。
  • 当您密切关注您的依赖关系时可以使用它,并准备好在次要版本不兼容的情况下快速更改代码。
  • 它会将您更新到最新的主要版本 (第一个数字)。
  • ^ 1.2.3将匹配包括1.3.0在内的任何1.xx版本,但会在2.0.0版本上延期。
  • Caret(^)也为您提供向后兼容的新function。

^:接受版本更改小于最左非零版本(从左侧第一个非零版本数字)。

〜:接受版本变化低于第二个最左非零版本(从左侧第二个非零版本数字)。 或者如果没有第二个最左边的非零版本,则接受版本变化小于最左边的版本。