4401

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

  1. 为什么要进行这些更改npm
  2. tilde~和 caret 和有什么不一样^
  3. 与其他人相比有什么优势?
4

19 回答 19

5052
于 2014-03-12T08:28:07.070 回答
1218

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

价值 描述
~version “大约相当于版本”
请参阅npm semver - 波浪号范围
^version “与版本兼容”
请参阅npm semver - Caret Ranges
version 必须完全匹配版本
>version 必须大于版本
>=version ETC
<version
<=version
1.2.x 1.2.0、1.2.1 等,但不是 1.3.0
* 匹配任何版本
latest 获取最新版本

上面的列表并不详尽。其他版本说明符包括 GitHub url 和 GitHub 用户存储库、本地路径和带有特定 npm 标签的包

官方文档

于 2014-09-16T06:25:07.670 回答
811

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

问题是旧版本通常不会收到那么多错误修复,因此 npm 使用插入符号 ( ^) 作为--save.

服务器表

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

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

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

伺服图

来源:“语义版本控制备忘单”

于 2015-07-30T20:40:32.690 回答
137

伺服器

<major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2
  • 使用npm semver 计算器进行测试。尽管对 ^(包括大于同一主要范围内的特定版本的所有内容)和 ~(包括大于同一次要范围内的特定版本的所有内容)的解释不是 100% 正确,但计算器似乎工作正常。
  • 或者,使用SemVer Check代替,它不需要您选择包并且还提供解释。

允许或禁止更改

  • 引脚版本: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

注意:缺少major、minor、patch或beta不指定编号,any与缺少的级别相同。

注意:当你安装一个0主级别的包时,更新只会安装新的 beta/pr 级别版本!那是因为npm设置^为默认值,package.json并且在安装版本时0.1.3,它会冻结所有主要/次要/补丁级别。

于 2015-10-11T16:52:35.957 回答
116

只要第一个数字(“主要”)至少为 1:

~锁定主要和次要号码。当您准备好只接受错误修复(第三个数字的增量)但不想要任何其他更改,甚至不想要添加功能的小升级时使用它。

^仅锁定主要号码。当您愿意接收错误修复(第三个数字的增量)和添加功能但不应破坏现有代码的小升级(第二个数字的增量)时,使用它。但是,您不希望破坏现有代码的更改(第一个数字的增量)。

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

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

(已修订以避免说“修复”和“错误修复”与“修复”的使用冲突,这是令人困惑的)

于 2014-03-12T23:05:52.597 回答
64

~:相当接近

   ~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
于 2014-06-27T16:12:27.693 回答
43

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

这篇关于semver如何应用于 npm
以及他们正在做什么以使其符合semver 标准
http://blog.npmjs.org/post/98131109725/npm-2-0-0的博文非常值得阅读

于 2014-12-15T18:07:07.360 回答
42

〜波浪号:

  • ~冻结主要和次要号码。
  • 当您准备好接受依赖项中的错误修复但不想要任何潜在的不兼容更改时使用它。
  • 波浪号匹配最新的次要版本(中间数字)。
  • ~1.2.3 将匹配所有 1.2.x 版本,但会错过 1.3.0。
  • 波浪号 (~) 为您提供错误修复版本

^ 插入符号:

  • ^仅冻结主要号码。
  • 当您密切关注您的依赖关系并准备好在次要版本不兼容时快速更改代码时使用它。
  • 它会将您更新到最新的主要版本(第一个数字)。
  • ^1.2.3 将匹配包括 1.3.0 在内的任何 1.xx 版本,但在 2.0.0 上会延迟。
  • 插入符号 (^) 还为您提供向后兼容的新功能。
于 2016-09-30T10:56:21.493 回答
35

帽子匹配可能被视为“损坏”,因为它不会更新^0.1.20.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,这意味着“此版本是一项长期服务,您可以继续并在您的生产中使用此版本的库代码,作者明天或下个月不会更改所有内容,也不会放弃包”。

规则是: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.
于 2015-10-19T11:24:26.043 回答
24

一班轮解释

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

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

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

例如:~2.4.1 意味着它将检查 2.4.x 其中 x 是什么

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

例如:^2.4.1 表示它将检查 2.xx 其中 x 是什么

于 2017-01-21T08:00:06.763 回答
23

波浪号 ~匹配次要版本,如果您安装了具有 1.4.2 的软件包,并且在安装后,如果在您的 package.json 中将其用作 ~1.4.2 然后 npm install ,则版本 1.4.3 和 1.4.4 也可用在您的项目中升级后将在您的项目中安装 1.4.4。但是该软件包有 1.5.0 可用,那么它不会被 ~ 安装。它被称为次要版本。

Caret ^匹配主要版本,如果您的项目中安装了 1.4.2 包,并且在您的安装 1.5.0 发布后,那么 ^ 将安装主要版本。如果您有^1.4.2,它将不允许安装 2.1.0 。

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

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

于 2019-01-17T10:32:28.733 回答
20

插入符号 ^包括大于同一主要范围内特定版本的所有内容。

波浪号 ~包括大于同一次要范围内特定版本的所有内容。

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

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

有关语义版本控制语法的更多信息,请参阅npm semver 计算器

已发布包中的 npm 语义版本§

更多来自 npm 文档关于语义版本控制

于 2019-07-01T11:43:55.617 回答
16

您可能已经在 package.json 中看到了波浪号 (~) 和插入符号 (^)。它们之间有什么区别?

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

波浪号 (~)

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

插入符号 (^)

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

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

于 2017-11-26T19:12:35.610 回答
7

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
于 2019-11-27T08:52:21.597 回答
6

波浪号 (~)

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

"express": "~4.13.3" 

~4.13.3意味着它将检查 4.13.x 其中 x 是任何东西和 4.14.0

插入符号 (^)

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

"supertest": "^3.0.0"

^3.0.0意味着它将检查 3.xx 其中 x 是什么

于 2018-03-09T12:21:06.693 回答
4

与此问题相关,您可以查看有关版本的 Composer 文档,但简而言之:

  • 波浪号版本范围 ( ~ ) - ~1.2.3 相当于 >=1.2.3 < 1.3.0
  • 插入符号版本范围 ( ^ ) - ~1.2.3 相当于 >=1.2.3 < 2.0.0

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

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

您可能应该查看这篇关于 composer install 和 composer update 之间差异的 stackoverflow 帖子

于 2020-02-18T14:36:15.047 回答
4

本身不是一个答案,而是一个似乎被忽视的观察结果。

插入符号范围的描述:

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

允许不修改 [major, minor, patch] 元组中最左边的非零数字的更改。

^10.2.3匹配的意思10.2.3 <= v < 20.0.0

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

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

于 2019-03-20T22:13:03.277 回答
4

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

主要.次要补丁 1.0.2

主要、次要和补丁代表一个包的不同版本。

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

因此,如果您看到 ~1.0.2,则表示安装版本 1.0.2 或最新的补丁版本,例如 1.0.4。如果您看到 ^1.0.2,则表示安装版本 1.0.2 或最新的次要版本或补丁版本,例如 1.1.0。

于 2018-09-28T06:58:51.150 回答
3

波浪号~指定次要版本

插入符号^指定主要版本发布

例如,如果包版本为4.5.2,则更新时:

~4.5.2将安装最新的4.5.x version (MINOR VERSION)

^4.5.2将安装最新的4.x.x version (MAJOR VERSION)

于 2018-05-04T11:02:59.393 回答