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

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

提问人:Fizer Khan 提问时间:3/12/2014 最后编辑:Nikita FedyashevFizer Khan 更新时间:9/11/2023 访问量:1685181

问:

在我升级到最新的稳定版后,我尝试了。它将条目保存在带有插入符号前缀的条目中。以前,它是波浪号前缀。nodenpmnpm install moment --savepackage.json^~

  1. 为什么在 ?npm
  2. tilde 和 caret 和有什么不一样?~^
  3. 与其他人相比有什么优势?
node.js npm package.json 语义版本控制

评论

67赞 fncomp 1/22/2015
仅供参考,您可以通过执行以下操作来阻止前缀或使用自定义前缀: .(如果您喜欢,请加上引号。我个人是这样做的,并为生产中的东西进行收缩包装。npm config set save-prefix=''~
30赞 Jeffrey Martinez 10/14/2015
波浪号和插入符号如何工作以及差异的所有细节:github.com/npm/node-semver#tilde-ranges-123-12-1
13赞 chaiyachaiya 12/13/2016
这个工具是测试 semver.npmjs.com 的好帮手
1赞 RBT 1/10/2019
npm 和 node 中的语义版本控制
1赞 ruffin 5/29/2021
npm shrinkwrappackage-lock.json 与 npm-shrinkwrap.json #toSaveYouAGoogle(或两个)的文档——fncomp 在上面提到,在下面提到 tehfoo。此外,肺炎:保持均匀,上升一点。~^

答:

6033赞 jgillich 3/12/2014 #1

请参阅 NPM 文档和 semver 文档

  • ~version “大致等同于版本”,将您更新到所有未来的补丁版本,而不会增加次要版本。 将使用从 1.2.3 到 <1.3.0 的版本。~1.2.3

  • ^version “与版本兼容”,将您更新到所有未来的次要/补丁版本,而不会增加主要版本。 将使用从 1.2.3 到 <2.0.0 的版本。^1.2.3

有关例外情况,请参阅下面的注释,特别是对于预版本,例如 ^0.2.3

评论

623赞 tehfoo 2/10/2015
在这里发帖希望能抓住那些没有完全考虑清楚的人,但 ^ 和 ~ 都假设你可以信任依赖项中的次要版本和点版本。如果您要发布库并希望其他人信任您,请不要盲目接受下游依赖项。从你的依赖中释放一个坏点会引起上游的连锁反应,当事情变成梨形时,人们会敲你的门。这是在生产代码上使用 npm shrinkwrap 的另一个重要原因。
57赞 kumarharsh 7/8/2015
你也可以去掉所有废话,npm在你的版本前面加上一个或一个。如果要严格控制版本,请设置以下项:^~npm config set save-prefix=''
15赞 rofrol 10/12/2015
@prasanthv是对的:从 docs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4:插入符号范围 ^1.2.3 ^0.2.5 ^0.0.4。允许不修改 [major, minor, patch] 元组中最左边的非零位数字的更改。换言之,这允许对版本 1.0.0 及更高版本进行补丁和次要更新,对版本 0.X >=0.1.0 进行补丁更新,对版本 0.0.X 不进行更新。
37赞 rofrol 10/12/2015
@jgillich 在 semver 中使用时,不是 .这就是为什么 docs.npmjs.com 使用了特定的词:.还有这种情况呢:^0.0.4 表示 0.0.40.2.x2major versionthe left-most non-zero digit
18赞 Maciej Sz 10/22/2015
@FagnerBrack:你提供的具体例子是正确的,但总的来说你的思维方式是错误的。举个例子:假设你有 3 个版本的包:、 和 。有一个错误,所以你希望至少在你的包中。如果你写,你会得到 ,这没关系。但是,如果其他一些软件包同时需要 and and 另外具有限制,您将在不显示任何冲突问题的情况下获得,这不是您想要的。使用波浪号应该可以帮助您避免此问题。A0.0.10.0.20.0.30.0.10.0.2B0.0.x0.0.3CBA"A": "<0.0.2"0.0.1~0.0.2
125赞 alex 3/13/2014 #2

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

~锁定主要数字和次要数字。当您准备仅接受错误修复(第三个数字中的增量)但不希望进行任何其他更改时,甚至不需要添加功能的次要升级时,就会使用它。

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

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

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

(经过修改,以避免在“修复”和“错误修复”中与“修复”的使用冲突,这令人困惑)

评论

14赞 rofrol 10/12/2015
不正确:插入符号范围 ^1.2.3 ^0.2.5 ^0.0.4。允许不修改 [major, minor, patch] 元组中最左边的非零位数字的更改。换言之,这允许对 1.0.0 及更高版本进行补丁和次要更新,对 0.X >=0.1.0 版本进行补丁更新,对 0.0.X 版本不进行更新 docs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4
6赞 TheBaj 7/14/2017
这个答案是完全错误的(就像这里的许多其他答案一样)。这些都不能解决一个主要数字!正如@rofrol所说,^ 只是保持最左边的非零数字不变。~ 另一方面,如果指定了次要版本(例如 ~1.2.3 或 ~1.2),则只允许补丁更新,如果未指定次要版本(例如 ~1),则允许次要更新。
3赞 maaartinus 7/11/2018
@TheBaj 它们的意思是“修复”为“定义”(“固定”)而不是“调整”,因此你们都同意如何处理主要数字。
1赞 nCardot 11/5/2019
是的,这个答案似乎完全是倒退的,直到我意识到回答者的意思是“固定”,如“使固定、静止或不变”。
69赞 haotang 6/28/2014 #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

评论

20赞 chharvey 2/26/2015
@kytwb - 不。在零版本号的特殊情况下,克拉等同于波浪号。因此只接受版本而不接受,即使这是一个很小的增量。此行为等效于 。这种行为背后的原因是,零版软件包仍然被认为是不稳定的;用 semver.org 的话来说,#4,“任何事情都可能随时改变”(包括向后不兼容的改变)。^0.1.30.1.x0.2.0~0.1.3
0赞 Feathercrown 8/1/2023
最后一个例子不是也不允许补丁升级吗?
1659赞 Ahmad 9/16/2014 #4

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

价值 DESC
~version 大致等同于版本,即只接受新的补丁版本
请参阅 npm semver - 波浪号范围
^version 与版本兼容,即接受新的次要版本和补丁版本
请参阅 npm semver - 插入符号范围
version 必须与版本完全匹配
>version 必须大于版本
>=version
<version
<=version
1.2.x 1.2.0、1.2.1 等,但不是 1.3.0
* 匹配任何版本
latest 获取最新版本

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

官方文档

评论

47赞 CodeManX 6/9/2016
也可以指定确切的版本范围,例如:正好是 1.2.0,或从 1.2.2 到 1.3.0(含)的所有内容,但不是 1.2.1,或 1.3.1 及更高版本,也不是 1.1.x 及更低版本。1.2.0 || >=1.2.2 <1.3.0
1赞 Toby 7/11/2018
上面的 -> docs.npmjs.com/files/package.json#dependencies 中有一个更具体的链接
22赞 Scott Stafford 7/17/2019
"Approximately equivalent to version"并且是描述~和^行为的令人沮丧的非特定方式。感谢您@jgillich提供实际答案!"Compatible with version"
1赞 Segfault 11/17/2021
@Timo“从不依赖版本的deps”可能并不存在。您可以拥有当前不依赖于版本的deps,但不能保证依赖项的未来版本向后兼容,因此除非您拥有依赖项和应用程序,否则可以肯定的是,最终“最新”将不起作用。在我看来,“最新”说明符的最佳用途似乎是在早期开发、概念验证或不会长期维护的短期项目中。
2赞 toastrackengima 7/6/2023
@Simon_Weaver 在这种情况下,对于补丁版本,是的,它们是等效的。但是,例如,如果您有 ,则等价于 ,而 将等价于 --- 本质上意味着任何大于或等于指定补丁版本的补丁版本,而 in 该位置表示任何数字。完整语法定义如下:github.com/npm/node-semver#advanced-range-syntax0~1.2.3>=1.2.3 <1.3.01.2.x>=1.2.0 <1.3.0~x
45赞 Will Stern 12/16/2014 #5

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

这篇博文介绍了 semver 如何应用于 npm
以及他们正在采取哪些措施来使其符合 semver 标准
http://blog.npmjs.org/post/98131109725/npm-2-0-0

评论

2赞 rofrol 10/12/2015
不正确:插入符号范围 ^1.2.3 ^0.2.5 ^0.0.4。允许不修改 [major, minor, patch] 元组中最左边的非零位数字的更改。换言之,这允许对 1.0.0 及更高版本进行补丁和次要更新,对 0.X >=0.1.0 版本进行补丁更新,对 0.0.X 版本不进行更新 docs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4
918赞 pspi 7/31/2015 #6

软件包管理器 npm 允许安装比指定版本更新的软件包版本。
使用波浪号 () 可以修复错误版本,而插入符号 () 还可以提供向后兼容的新功能。
~^

问题是旧版本通常不会收到错误修复,因此 npm 使用 caret () 作为 的默认值。^--save

SemVer table

资料来源:“SemVer 解释 - 为什么我的package.json中有一个插入符号 (^)?

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

以下是这些概念的直观说明:

semver diagram

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

评论

3赞 rofrol 10/12/2015
^0.2.5呢?从 docs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4:插入符号范围 ^1.2.3 ^0.2.5 ^0.0.4。允许不修改 [major, minor, patch] 元组中最左边的非零位数字的更改。换言之,这允许对版本 1.0.0 及更高版本进行补丁和次要更新,对版本 0.X >=0.1.0 进行补丁更新,对版本 0.0.X 不进行更新。
21赞 pspi 11/4/2015
@rofrol 1.0.0 之前的任何版本都被视为不稳定,这些规则不适用
3赞 rofrol 11/4/2015
所以你的解释不完整
8赞 pspi 11/5/2015
@rofrol是的,有时省略可读性是件好事,包 json 中依赖项的几率低于 1.0.0 的可能性非常低。另见 20/80 原则,是专注于重要事情的伟大规则
12赞 Dave Newton 8/9/2016
@pspi 版本低于 1.0.0 是“不太可能”的?在 60 个中,我们有 ~15 个,其中大多数并不晦涩难懂。
151赞 rofrol 10/12/2015 #7

森弗

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

允许或禁止更改

  • 引脚版本:。1.2.3
  • 使用(如头部)。允许在左起第二个非零级别进行更新:均值 。^^0.2.30.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 right-most level:表示 。不同之处在于:0.20.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

注意:缺少主要、次要、补丁或指定不带编号,与缺少的级别相同。betaany

注意:当您安装具有主要级别的软件包时,更新将仅安装新的 beta/pr 级别版本!这是因为设置为默认值,当安装的版本为 时,它会冻结所有主要/次要/补丁级别。0npm^package.json0.1.3

评论

0赞 ProLoser 9/23/2016
告诉人们避免从 0 开始项目,因为库和消耗开发人员不了解系统是一个糟糕的解决方案。我认为@asdfasdfads有更好的信息。
0赞 rofrol 9/23/2016
@ProLoser我只是认为系统应该简化,我们不应该使用 0.x 版本。
2赞 ProLoser 9/24/2016
围绕早期生命周期开发和 v0 的用例很有意义。学习 v0 的正确行为实际上让我对其他早期生命周期项目充满期待。这意味着你可以拥有一个快速变化的 API,其中包含许多向后不兼容的地方,而不必被迫将你的项目声明为 1.x(又名:稳定),而实际上它不是。
0赞 rofrol 9/24/2016
我理解它,但我只是不喜欢它与 semver 和限定符的工作方式
5赞 ProLoser 10/12/2016
这感觉更像是一种观点,不应该被框定为一种普遍接受的方法。^0.1.x 得到补丁完全没问题。
37赞 catamphetamine 10/19/2015 #8

帽子匹配可能被视为“损坏”,因为它不会更新到 .当软件出现时,使用版本和帽子匹配将只匹配最后一个变化的数字 ()。这是故意的。原因是,当软件不断发展时,API 会迅速变化:有一天你有这些方法,有一天你有这些方法,旧的方法就消失了。如果你不想为已经在使用你的库的人破坏代码,你可以去增加主要版本:例如 -> -> .因此,当您的软件最终 100% 完成并功能齐全时,它将像版本一样,看起来意义不大,实际上看起来很混乱。另一方面,如果您使用的是 -> -> 版本,那么当软件最终 100% 完成并功能齐全时,它就会作为版本发布,这意味着“此版本是一个长期服务版本,您可以继续并在您的生产代码中使用此版本的库,作者明天不会更改所有内容, 或者下个月,他不会放弃包裹”。^0.1.20.2.00.x.yy1.0.02.0.03.0.011.0.00.1.x0.2.x0.3.x1.0.0

规则是:当你的软件尚未成熟时,使用版本控制,当你的公共 API 发生变化时,通过递增中间数字来发布它(因此,拥有版本控制的人不会得到更新,也不会破坏他们的代码)。然后,当软件成熟时,每次更改公共 API 时,将其释放并递增最左边的数字(因此,拥有更新的人不会得到更新,也不会破坏他们的代码)。0.x.y^0.1.00.2.01.0.0^1.0.02.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.

评论

0赞 ProLoser 9/23/2016
这个评论非常有帮助,似乎没有得到很好的记录。您是否有有关此行为的文档的链接?这个关于 v0 项目的答案对我有很大帮助。
0赞 catamphetamine 9/23/2016
我没有链接:我也通过谷歌搜索和玩 npm 语义版本计算器找到了这些信息 semver.npmjs.com
2赞 ProLoser 9/24/2016
需要以更正式的方式添加到他们的文档中。我在索尼给我的工程团队做了一次演讲,因为它似乎很容易被忽视。slides.com/proloser/semver-v0
46赞 Laxmi 9/30/2016 #9

~波浪号:

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

^ 插入符号:

  • ^仅冻结主号码。
  • 当您密切关注依赖项并准备在次要版本不兼容时快速更改代码时,会使用它。
  • 它会将您更新到最新的主要版本(第一个数字)。
  • ^1.2.3 将匹配任何 1.x.x 版本,包括 1.3.0,但它将推迟 2.0.0。
  • 插入符号 (^) 还为您提供了向后兼容的新功能。

评论

2赞 Abdul Rauf 3/30/2018
波浪号与最新的修补程序版本(最后一个数字)匹配。插入符号与最新的次要版本(中间数字)匹配。
1赞 mhrabiee 9/4/2019
“冻结”是最好的解释。
0赞 nCardot 1/30/2020
插入符号既冻结了主数字,又会将您更新到最新的主要版本(第一个数字)?主数字是第一个数字,所以这没有意义。
26赞 Avinash 1/21/2017 #10

一班说明

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

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

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

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

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

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

评论

10赞 FluxLemur 4/4/2018
我在这个答案中看到 7 行
17赞 Abdou Sameh 11/27/2017 #11

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

评论

0赞 Leo 2/28/2019
同样,这个答案具有误导性。SemVer 明确指出,普通版本号必须采用 X.Y.Z [其中] X 是主要版本,Y 是次要版本,Z 是补丁版本。
31赞 Farhan Yaseen 3/9/2018 #12

波浪号 (~)

主要版本是固定的,次要版本是固定的,与任何版本匹配 数

"express": "~4.13.3" 

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

插入符号 (^)

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

"supertest": "^3.0.0"

^3.0.0意味着它将检查 3.x.x,其中 x 是任何东西

评论

2赞 Franklin Yu 11/7/2018
您能详细说明一下这个答案与 4 年前发布的相同答案有何不同吗?
4赞 neeraj-dixit27 5/4/2018 #13

波浪号指定次要版本发布~

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

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

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

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

评论

11赞 Franklin Yu 11/7/2018
您能详细说明一下这个答案与 4 年前发布的相同答案有何不同吗?
0赞 Henke 9/11/2023
感谢您的出色、简短和简洁的回答。非常感谢。
4赞 Rajashekhar Reddy 9/28/2018 #14

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

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。

评论

1赞 Franklin Yu 11/7/2018
您能详细说明一下这个答案与 4 年前发布的相同答案有何不同吗?
24赞 Mudassir 1/17/2019 #15

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

插入符号 ^ 与主要版本匹配,如果您的项目中安装了 1.4.2 包,并且在安装 1.5.0 发布后,则 ^ 将安装主要版本。如果您有 ^1.4.2,则不允许安装 2.1.0。

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

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

评论

3赞 Leo 2/28/2019
这个答案具有误导性。SemVer 明确指出,普通版本号必须采用 X.Y.Z [其中] X 是主要版本,Y 是次要版本,Z 是补丁版本。
5赞 Jesse Chisholm 3/21/2019 #16

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

插入符号范围的描述:

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

允许不修改 [major, minor, patch] 元组。

表示匹配^10.2.310.2.3 <= v < 20.0.0

我不认为这是他们的意思。拉入版本 11.x.x 到 19.x.x 将破坏您的代码。

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

评论

1赞 t0r0X 12/4/2021
请注意,措辞在此期间已固定:.Allows changes that do not modify the left-most non-zero element
33赞 ElasticCode 7/1/2019 #17

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

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

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

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

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

npm semantic versions in published packages§

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

7赞 ireshika piyumalie 11/27/2019 #18

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
6赞 milan.latinovic 2/18/2020 #19

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

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

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

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

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

5赞 Leandro Ariel 2/27/2023 #20

例如,对于 : ~1.8.0,您将匹配所有 1.8.x 版本,但您将丢失 1.9.0(这是默认行为)。

例如,对于 : ^1.8.0,您将更新到最新的主要版本(第一期)。任何 1.x.x 版本,包括 1.9.0,但与版本 2.0.0 保持距离

例 3.9.2.

Symbol     Dependency   Versions    Changes
tilde (~)   ~3.9.2        3.9.*      -bug fix

caret (^)   ^3.9.2        3.*.*      -backwards compatible new functionality 
                                     -old functionality deprecated, but operational
                                     -large internal refactor
                                     -bug fix
0赞 ZowWeb 9/8/2023 #21

根据 semver 文档

波浪号范围

如果在比较器上指定了次要版本,则允许修补程序级别的更改。如果没有,则允许进行次要级别的更改。

例如

  • ~1.2.x 表示 >=1.2.3 <1.3.0
  • ~1.2 表示 >=1.2.0 <1.3.0

插入符号范围

允许不修改 [major, minor, patch] 元组中最左边的非零位数字的更改。换言之,这允许对版本 1.0.0 及更高版本进行补丁和次要更新,对版本 0.X >=0.1.0 进行补丁更新,对版本 0.0.X 不进行更新。

注意:许多作者将 0.x 版本视为 x 是主要版本 “Breaking-Change”指标。

例如

  • ^1.2.x 表示 >=1.2.0 <2.0.0
  • ^1.2.3-beta.2 表示 >=1.2.3-beta.2 <2.0.0
  • ^0.0.x 表示 >=0.0.0 <0.1.0
  • ^0.0 表示 >=0.0.0 <0.1.0