升级到最新稳定版node
和npm
后,我尝试了npm install moment --save
。它使用插入符package.json
前缀保存^
中的条目。以前,它是一个波浪号~
前缀。
npm
中进行了这些更改? ~
和插入符号^
之间有什么区别?答案 0 :(得分:3275)
代字号
~
匹配指定次要版本(第二个数字)的最新修补程序版本(第三个数字)。
~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/)的修改和更正版本
答案 1 :(得分:738)
我想添加官方的npmjs文档,其中描述了版本特异性的所有方法,包括问题中提到的那些 -
https://docs.npmjs.com/files/package.json
https://docs.npmjs.com/misc/semver#x-ranges-12x-1x-12-
~version
"大致相当于版本"见npm semver - Tilde Ranges& semver (7) ^version
"与版本"兼容见npm semver - Caret Ranges& semver (7) version
必须与版本完全匹配>version
必须大于版本>=version
等<version
<=version
1.2.x
1.2.0,1.2.1等,但不是1.3.0 http://sometarballurl
(这可能是将在本地下载和安装的tarball的网址*
匹配任何版本latest
获得最新版本以上列表并非详尽无遗。其他版本说明符包括GitHub URL和GitHub用户repo,本地路径和具有特定npm标记的包
答案 2 :(得分:468)
Npm允许安装比指定版本更新的软件包版本。使用波浪号(~
)为您提供错误修复版本,而插入符号(^
)也为您提供向后兼容的新功能。
问题是旧版本通常不会收到错误修复,所以npm使用插入符号(^
)作为--save
的默认值。
根据:"Semver explained - why there's a caret (^) in my package.json?"。
注意规则适用于1.0.0以上的版本,而不是每个项目都遵循语义版本。对于版本0.x.x,插入符号仅允许 patch 更新,即它的行为与波形符相同。见"Caret Ranges"
以下是概念的直观解释:
答案 3 :(得分:83)
~
修复主要和次要数字。当您准备接受依赖项中的错误修复时,可以使用它,但不希望任何可能不兼容的更改。
^
仅修复主要数字。当您密切关注您的依赖关系时,它会被使用,如果次要版本不兼容,您可以快速更改代码。
除此之外,旧的npm版本^
为not supported,应谨慎使用。
所以,^
是一个很好的默认值,但它并不完美。我建议您仔细挑选并配置对您最有用的semver运算符。
答案 4 :(得分:82)
<major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2
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
注意:缺少主要,次要,修补程序或指定beta
没有编号,与缺失级别的any
相同。
注意:当您安装包含0
作为主要级别的软件包时,更新将仅安装新的beta / pr级版本!这是因为npm
将^
设置为package.json
中的默认值,并且当安装的版本类似于0.1.3
时,它会冻结所有主要/次要/补丁级别。
答案 5 :(得分:51)
~
:合理地关闭到
~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
答案 6 :(得分:28)
^
是1. [any]。[any](最新的次要版本)
~
是1.2。[任何](最新补丁)
关于semver如何应用于npm的一个很好的阅读this blog post
他们正在做些什么来使它匹配the semver standard
http://blog.npmjs.org/post/98131109725/npm-2-0-0
答案 7 :(得分:27)
可以考虑帽子匹配&#34;破坏&#34;因为它不会将^0.1.2
更新为0.2.0
。当软件出现时,使用0.x.y
版本,并且帽子匹配将仅匹配最后一个变化的数字(y
)。这是故意的。原因在于,虽然软件正在发展,但API的变化很快:有一天你有这些方法,有一天你有这些方法而旧的方法已经消失了。如果您不想破坏已经使用您的图书馆的人的代码,您可以增加主要版本:例如: 1.0.0
- &gt; 2.0.0
- &gt; 3.0.0
。因此,当您的软件最终100%完成并且功能齐全时,它将类似于版本11.0.0
,并且看起来不是很有意义,实际上看起来很混乱。另一方面,如果您使用0.1.x
- &gt; 0.2.x
- &gt; 0.3.x
版本,当软件最终100%完成并且功能齐全时,它将作为版本1.0.0
发布,这意味着&#34;此版本是长期服务版本,您可以继续在您的生产代码中使用此版本的库,并且作者明天或下个月都不会改变所有内容,并且他不会放弃该软件包&#34;。
规则是:当您的软件尚未成熟时使用0.x.y
版本控制,并在公共API发生变化时通过递增中间数字来释放它(因此^0.1.0
赢得了0.2.0
的人得到1.0.0
更新,它不会破坏他们的代码)。然后,当软件成熟时,将其释放到^1.0.0
下,并在每次公开API更改时递增最左边的数字(因此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.
更新,并且赢了& #39;打破他们的代码。)
rid="Vajravelu:1978"
答案 8 :(得分:14)
单线解释
标准版本控制系统是major.minor.build(例如2.4.1)
npm根据这些字符
检查并修复特定包的版本〜:主要版本已修复,次要版本已修复,匹配任何内部版本号
e.g。 :~2.4.1表示它将检查2.4.x,其中x是
^ :主要版本已修复,匹配任何次要版本,匹配任何内部版本号
e.g。 :^ 2.4.1表示它将检查2.x.x,其中x是
答案 9 :(得分:12)
你可能已经在package.json中看到了波形符(〜)和插入符号(^)。他们之间有什么区别?
当您执行npm install moment --save时,它会使用插入符号(^)保存package.json中的条目。
用最简单的术语来说,波浪号(〜)匹配最近的次要版本(中间号码)。 ~1.2.3将匹配所有1.2.x版本,但将错过1.3.0。
参考:https://medium.com/@Hardy2151/caret-and-tilde-in-package-json-57f1cbbe347b
答案 10 :(得分:11)
波浪〜与次要版本匹配,如果您已安装具有1.4.2的软件包,则在安装后,如果package.json中也提供了1.4.3和1.4.4版本。用作〜1.4.2,然后在升级后在项目中安装npm,将在项目中安装1.4.4。但是该软件包有1.5.0可用,因此〜不会安装。它称为次要版本。
Caret ^ 与主要版本匹配,如果项目中停滞了1.4.2软件包并且还提供了1.5.0,则^将安装主要版本。如果您具有 ^ 1.4.2 ,则不允许安装2.1.0。
固定版本,如果您不想在每次安装时都更改软件包的版本,则使用不带任何特殊字符的固定版本,例如“ 1.4.2” >
最新版本* 如果要安装最新版本,则仅在包名称前使用*。
答案 11 :(得分:7)
〜蒂尔德:
~
修复主要和次要数字。 ^ Caret:
^
仅修复主要数字。答案 12 :(得分:5)
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是任何
答案 13 :(得分:4)
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
答案 14 :(得分:3)
版本号的语法表示每个部分的含义不同。语法分为三部分,用点分隔。
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)。
答案 15 :(得分:2)
〜指明次要版本发布 ^指定主要版本发布
例如,如果软件包版本是4.5.2,则更新 ~4.5.2将安装最新的4.5.x版本(MINOR VERSION) ^ 4.5.2将安装最新的4.x.x版本(MAJOR VERSION)
答案 16 :(得分:1)
本质上,这不是一个答案,但似乎被忽略了。
克拉范围的描述:
请参阅:https://github.com/npm/node-semver#caret-ranges-123-025-004
Allows changes that do not modify the left-most non-zero digit in the [major, minor, patch] tuple.
表示^10.2.3
与10.2.3 <= v < 20.0.0
匹配
我认为那不是他们的意思。从11.x.x到19.x.x插入版本会破坏您的代码。
我认为它们的意思是left most non-zero number field
。 SemVer中没有要求数字字段为一位的数字。
答案 17 :(得分:1)
克拉 ^
在相同的主要范围内包含比特定版本更大的所有物品。
波浪号 ~
在相同的较小范围内包含大于特定版本的所有内容。
例如,要指定可接受的最高版本范围为1.0.4,请使用以下语法:
有关语义版本语法的更多信息,请参见npm semver calculator。
npm文档About semantic versioning中的更多内容
答案 18 :(得分:1)
有关此问题,您可以查看Composer documentation on versions,但简而言之:
因此,通过 Tilde ,您将获得补丁的自动更新,但次要和主要版本将不会更新。但是,如果您使用 Caret ,则将获得补丁程序和次要版本,但不会获得主要(重大更改)版本。
Tilde版本被认为是“更安全”的方法,但是,如果您使用可靠的依赖项(维护良好的库),则Caret版本不会有任何问题(因为较小的更改不应破坏更改。
您可能应该查看this stackoverflow post about differences between composer install and composer update。