关于node.js:package.json中的tilde(?)和插入符号(^)有什么区别?

What's the difference between tilde(~) and caret(^) in package.json?

在我升级到最新的稳定的nodenpm之后,我尝试了npm install moment --save。它保存package.json中带有插入符号^前缀的条目。以前,它是tilde ~前缀。

  • 为什么在npm中进行这些更改?
  • tilde ~和caret ^有什么区别?
  • 与其他人相比有什么优势?

  • The tilde ~ matches the most recent patch version (the third number) for the specified minor version (the second number).
    ~1.2.3 will match all 1.2.x versions but will hold off on 1.3.0.

    The caret ^ is more relaxed. It matches
    the most recent minor version (the second number) for the specified major version (the first number).
    ^1.2.3 will match
    any 1.x.x release including 1.3.0, but will hold off on 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系列和Semver(7)
    • ^version与版本兼容参见NPM Semver-插入符号范围和Semver(7)
    • version必须与版本完全匹配
    • >version必须大于版本
    • >=version
    • <=version
    • 1.2.x1.2.0、1.2.1等,但不是1.3.0
    • http://sometarballurl(这可能是一个tarball的URL,它将在本地下载和安装
    • *匹配任何版本
    • latest获得最新版本

    上述清单并不详尽。其他版本说明符包括GitHub URL和GitHub用户报告、本地路径和带有特定NPM标记的包。


    NPM允许安装比指定版本更新的包版本。使用tilde(~提供了错误修复版本,caret(^提供了向后兼容的新功能。

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

    semver table

    根据:"Semver解释了-为什么我的包中有一个插入符号(^)。json?".

    注意,这些规则适用于1.0.0以上的版本,并不是每个项目都遵循语义版本控制。对于0.x.x版本,插入符号只允许补丁更新,即它的行为与tilde相同。参见"插入符号范围"

    以下是对这些概念的直观解释:

    semver diagram

    来源:"语义版本控制作弊表"。


    ~修正了大数和小数。当您准备接受依赖项中的错误修复,但不希望进行任何可能不兼容的更改时,可以使用它。

    ^只固定主编号。当您密切关注您的依赖关系,并且准备好在次要版本不兼容的情况下快速更改代码时,就会使用它。

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

    所以,^是一个很好的违约,但它并不完美。我建议仔细地选择和配置Semver操作符,它对您最有用。


    semver

    1
    <major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2
    • 用ICM semver calculator为试验。(虽然"explanations为^(包括一切是更大的比的特定版本在相同的主要范围)和~(包括一切是更大的比的特定版本在相同的小范围)不在100%是的先生,calculator似乎工作的很好)
    • alternatively,使用semver检查代替,这并不require T接你的包和explanations也提供。

    允许或disallow变化

    • 密码:1.2.3版本。
    • 使用^(像头)。allows updates美元第二非零水平从左:^0.2.3意味着0.2.3 <= v < 0.3
    • 使用~(像尾)。一般的冻结,对现在或omitted:如果零水平集
      • ~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。differs从~因为:
      • 始omitted层次版也总是0
      • 你可以设定开始主要版本没有specifying sublevels。

    所有的(hopefully)possibilities

    设定起始主要层次和允许updates向上 P / < >

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

    冻结的主要层次 P / < >

    1
    2
    3
    4
    5
    6
    ~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

    冻结的次要层次 P / < >

    1
    2
    3
    4
    5
    ^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

    冻结的补丁层次 P / < >

    1
    2
    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)

    disallow updates P / < >

    1
    2
    1.2.3             1.2.3
    ^0.0.3 (0.0.3)    0.0.3

    注意:错过了主要的,次要的补丁,或specifying beta没有号码,也同样的年代any为错过了层次。 P / < >

    注意:当你install的说明书,腹部0个主要层次,更新将只在installβ/ PR水平的版本。这是因为npm集J AS ^违约在package.json当installed版本也像0.1.3,它freezes所有主要/次要levels /补丁。 P / < >

    • docs.npmjs.com https:/ / / / / misc semver
    • docs.npmjs.com https:/ / / /文件/ package.json # dependencies


    ~:相当接近

    1
       ~1.1.5: 1.1.0 <= accepted < 1.2.0

    ^兼容

    1
    2
    3
    4
    5
       ^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.[任何](最新补丁)

    这篇关于semver如何应用于npm的博文是一个很好的读物。他们所做的是使其符合Semver标准
    http://blog.npmjs.org/post/98131109725/npm-2-0-0


    六或可能被视为"破",因为它的更新到0.2.0^0.1.2韩元。当软件也使用新兴的0.x.y版本和六只会或比赛的最后varying数码(y)。这对在专用的。的原因是,在"软件也evolving API的变化rapidly:有一天你有这些方法和其他的一天你有那些方法和旧的ones离开的时候。如果你不想打破的代码为人民谁已经是使用你的图书馆,你去和increment的主要版本:如1.0.0- > 2.0.0- > 3.0.0。所以,通过时间的软件也终于做了100 %和全featured它会像11.0.0版本,这不能被看的很meaningful,但是看起来和confusing。如果你是,在另一方面,用0.1.x- > 0.2.x- > 0.3.x版本,然后通过时间的软件也终于做了100 %和全featured它也发布了2008版1.0.0和它意味着"这释放的一个长期的服务,你可以proceed和使用这个版本的图书馆在你的代码和在生产,uthor不会改变一切,明天,或者下个月,他不会被放弃的"包装"。 P / < >

    的规则:当你的软件的使用0.x.yversioning hasn ',还matured和释放它与incrementing中间的数字的当你的公共API的变化(therefore人物具有^0.1.0不会得到0.2.0更新和它不会被打破他们的代码)。然后,当软件matures,释放它的社团,1.0.0和increment的leftmost数字的每一次你的公共API的变化(therefore人物具有^1.0.0不会得到2.0.0更新和它不会被打破他们的代码)。 P / < >

    1
    2
    3
    4
    5
    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.


    一个线性的解释

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

    检查和很酷的新版本,基于这些特征,特别是包

    ~ : major version is fixed, minor version is fixed, matches any build number

    例如:均值,它将为2.4.x 2.4.1检查是在X的是什么

    ^ : major version is fixed, matches any minor version, matches any build number

    例如:均值,它将为2.x.x 2.4.1检查是在X的是什么


    你可能已经看到在caret(~)和波浪线在package.json(^)。他们之间的差异是什么?

    当你安装新的saves --保存,它的入口在package.json caret(^)前缀。

    在波浪(~)

    在简的波浪条件,在最近的比赛中(~)(中间的小版本号)。1.2.3将匹配所有1.2.x ~但威尔小姐1.3.0版本。

    在caret(^)

    在caret(^),在其他的手,是更多的轻松。它将更新你的最新的主要版本(第一号)。1.2.3将匹配任何1.x.x释为包括1.3.0,但将保持离线在线2.0.0。

    参考:http:/ / / / caret medium.com @ hardy2151和波浪线在包装57f1cbbe347b JSON。


    火柴的小波浪线~如果你要安装的版本,该软件包已经安装的版本1.4.2 1.4.3后和你,和你也是可用的如果1.4.4 package.json ~它是用来在你的项目,然后在新安装后会在你安装1.4.4升级项目。但是,有一个可用的软件包,然后那1.5.0)它将不被安装。这一个被称为小版本。

    caret ^比赛专业版,如果你的项目中stalled 1.4.2封装也可为与当时是1.5.0将安装专业版。它将不允许,如果你有安装1.4.2 2.1.0平方公尺。

    修正版,如果你不想改变每个版本的安装包,然后使用在线版的任何特殊性外固定(例如"在"

    *最新版本安装最新的版本,如果你想只使用,然后在前面的包的名称。


    波浪:~

    • 很酷的~主次号码。
    • 它是用于当你准备好接受一个在你的依赖。但我想incompatible任何潜在的变化。
    • 在最近的比赛中的波浪线(中间的小版本号)。
    • 将匹配所有1.2.x~1.2.3版本1.3.0小姐,但它会的。
    • 波浪(~)你释放了错误修复

    caret:^

    • 主要^酷号只。
    • 它是用于当你仔细看你的限制和快速的变化是准备你的代码将被释放,如果incompatible小调。
    • 它将更新你的最新的主要版本(第一号)。
    • 1.2.3将匹配任何1.x.x释为包括1.3.0,但它将保持离线在线2.0.0。
    • caret(^)给你backwards兼容的新功能,以及。


    波浪(~)

    major version is fixed, minor version is fixed, matches any build
    number

    1
    "express":"~4.13.3"

    ~4.13.3均值,它将检查是在X和4.14.0 4.13.x是什么

    caret(^)

    major version is fixed, matches any minor version, matches any build
    number

    1
    "supertest":"^3.0.0"

    它将检查是3.x.x ^3.0.0均值X是什么地方


    该版本号是在每一个具有不同截面的designates语法意义。语法是由三段破碎到分隔点。

    major.minor.patch1.0.2

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

    NPM使用波浪线(A)和caret(^)和次要版本的补丁designate这对使用的影响。

    所以如果你看它~1.0.2 1.0.2版本的k-means或安装最新的补丁1.0.4版如。如果你看到它的均值为1.0.2 1.0.2版本安装最新的补丁或小或如1.1.0版本。


    对~ specfices小调版发布专业版发布(指明)

    例如,如果包是相同的版本,在线更新将安装最新版本的4.5.x~4.5.2(小版)将安装最新版本的4.x.x ^ 4.5.2(专业版)


    从本质上来说,这不是一个答案,而是一个被忽视的观察。

    克拉范围说明:

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

    1
    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中没有要求数字字段为单个数字的内容。