首页 文章

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

提问于
浏览
2487

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

  • 为什么在 npm 中进行了这些更改?

  • tilde(~)caret(^) 有什么区别?

  • 与其他人相比有哪些优势?

14 回答

  • 76

    ^ 是1. [any] . [any](最新的小版本)
    ~ 是1.2 . [any](最新补丁)

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

  • 68

    最简单的说,代字号与最新的次要版本(中间数字)相匹配 . ~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/

    请注意,作者的术语有些误导:当他说"the most recent minor version"表示“他指的是”指定的次要版本中最新的 patch 版本". Similarly for ^, "最新的主要版本" should be read as "指定主要版本中最新的 minor 版本“ .

  • 0

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

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

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

    • ~version "Approximately equivalent to version"见npm semver - Tilde Rangessemver (7)

    • ^version "Compatible with 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标记的包

  • 404

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

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

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

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

    以下是概念的直观解释:

    资料来源:"Semantic Versioning Cheatsheet" .

  • 1

    ~ 修复了主要和次要数字 . 当您想要任何可能不兼容的更改时使用它 .

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

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

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

  • 10

    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 .

    • Ommit最右边的级别: 0.2 表示 0.2 <= v < 1 . 与 ~ 不同,因为:

    • 开始省略级别版本总是 0

    • 您可以在不指定子级别的情况下设置起始主要版本 .

    所有(希望)可能性

    Set starting major-level and allow updates upward

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

    Freeze major-level

    ~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
    

    Freeze minor-level

    ^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
    

    Freeze patch-level

    ~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

    1.2.3             1.2.3
    ^0.0.3 (0.0.3)    0.0.3
    

    Notice :缺少主要,次要,补丁或指定 beta 没有编号,与缺失级别的 any 相同 .

    Notice :当您安装 0 作为主要级别的软件包时,更新将只安装新的beta / pr级版本!这是因为 npmpackage.json 中将 ^ 设置为默认值,并且当安装的版本类似于 0.1.3 时,它会冻结所有主要/次要/补丁级别 .

  • 4

    ~ :合理 close

    ~1.1.5: 1.1.0 <= accepted < 1.2.0
    

    ^Compatible

    ^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
    
  • 3

    帽子匹配可能被认为是"broken"因为它不会将 ^0.1.2 更新为 0.2.0 . 当软件出现时,使用 0.x.y 版本和帽子匹配将仅匹配最后一个变化的数字( 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 发布,这意味着"This release is a long-term service one, you can proceed and use this version of the library in your production code, and the author won't change everything tomorrow, or next month, and he won't abandon the package" .

    规则是:当您的软件尚未成熟时使用 0.x.y 版本控制,并在公共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.
    
  • 2874

    One liner explanation

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

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

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

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

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

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

  • 7

    您可能已经在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

  • 47

    ~ Tilde:

    • ~ 修正 major and minor numbers.

    • 当您想要任何可能不兼容的更改时使用它 .

    • 代字号与 most recent minor version (中间数字)匹配 .

    • ~1.2.3将匹配所有1.2.x版本,但它将错过1.3.0 .

    • Tilde(〜)为您提供错误修复版本

    ^ Caret:

    • ^ 仅修复了主要编号 .

    • 当您仔细观察您的依赖关系并且准备好快速更改代码时,如果次要版本不兼容,则会使用它 .

    • 它会将您更新为 most recent major version (第一个数字) .

    • ^ 1.2.3将匹配包括1.3.0在内的任何1.x.x版本,但它将在2.0.0上推迟 .

    • Caret(^)也为您提供向后兼容的新功能 .

  • 24

    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是任何东西

  • 648

    版本号在语法中指定具有不同含义的每个部分 . 语法分为三个用点分隔的部分 .

    major.minor.patch 1.0.2

    Major,minor和patch表示包的不同版本 .

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

    因此,如果您看到~1.0.2,则表示安装版本1.0.2或最新的补丁版本(如1.0.4) . 如果你看到^ 1.0.2,则表示安装版本1.0.2或最新的版本或补丁版本,如1.1.0 .

  • 24

    〜规范到次要版本发布^指定主要版本发布

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

相关问题