我已经升级到最新的稳定后node
和npm
,我试过npm install moment --save
.它package.json
使用^
前缀保存条目.以前,它是一个~
前缀.
为什么要进行这些更改npm
?
~
和之间有什么区别^
?
比其他人有什么优势?
jgillich.. 3554
最简单的说,代字号与最新的次要版本(中间数字)匹配.~1.2.3将匹配所有1.2.x版本,但将错过1.3.0.
另一方面,插入符号更放松.它会将您更新为最新的主要版本(第一个数字).^ 1.2.3将匹配任何1.xx版本,包括1.3.0,但将在2.0.0推迟.
http://fredkschott.com/post/2014/02/npm-no-longer-defaults-to-tildes/
请注意,作者的术语有些误导:当他说"最近的次要版本"时,他的意思是" 指定次要版本中最新的补丁版本".类似地,对于^,"最新的主要版本"应该被理解为" 指定主要版本中的最新次要版本".
Npm允许安装比指定版本更新的软件包版本.使用tilde(~
)为您提供错误修复版本,而caret(^
)也为您提供向后兼容的新功能.
问题是旧版本通常不会收到太多错误修复,所以npm使用caret(^
)作为默认值--save
.
根据:"Semver解释 - 为什么我的package.json中有一个插入符号(^)?" .
请注意,规则适用于1.0.0以上的版本,并非每个项目都遵循语义版本.对于0.xx版本,插入符号仅允许修补程序更新,即它的行为与代字号相同.见"Caret Ranges"
这是对概念的直观解释:
资料来源:"Semantic Versioning Cheatsheet".
最简单的说,代字号与最新的次要版本(中间数字)匹配.~1.2.3将匹配所有1.2.x版本,但将错过1.3.0.
另一方面,插入符号更放松.它会将您更新为最新的主要版本(第一个数字).^ 1.2.3将匹配任何1.xx版本,包括1.3.0,但将在2.0.0推迟.
http://fredkschott.com/post/2014/02/npm-no-longer-defaults-to-tildes/
请注意,作者的术语有些误导:当他说"最近的次要版本"时,他的意思是" 指定次要版本中最新的补丁版本".类似地,对于^,"最新的主要版本"应该被理解为" 指定主要版本中的最新次要版本".
~
修复主要和次要数字.当您准备接受依赖项中的错误修复但不希望任何可能不兼容的更改时,可以使用它.
^
仅修复主要数字.当您仔细观察您的依赖项并且准备好快速更改代码时,如果次要版本不兼容,则会使用它.
除此之外,^
是不支持由旧版本的NPM,并应谨慎使用.
所以,这^
是一个很好的默认,但它并不完美.我建议您仔细挑选和配置对您最有用的semver运算符.
~
:合理接近至
~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
^
是1. [any].[any](最新的次要版本)
~
是1.2.[any](最新补丁)
一个伟大的读取是这个博客帖子上semver如何适用于NPM
和他们在做什么,使之匹配的semver标准
http://blog.npmjs.org/post/98131109725/npm-2-0-0
我想添加官方的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的URL
*
匹配任何版本
latest
获得最新版本
以上列表并非详尽无遗.其他版本说明符包括GitHub网址和GitHub用户存储库,本地路径和包含特定npm标记的包
帽子匹配可以被认为是"破",因为它不会更新^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
,这意味着"此版本是一个长期服务版本,您可以在生产中继续使用此版本的库代码,作者不会在明天或下个月改变一切,他也不会放弃这个包".
规则是: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.
<major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2
使用npm semver计算器进行测试.(虽然对^的解释(包括在同一主要范围内的特定版本以外的所有内容)和〜(包括在同一次要范围内的特定版本以外的所有内容)都不是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
.
最正确的程度: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
,它会冻结所有主要/次要/补丁级别.
https://docs.npmjs.com/misc/semver
https://docs.npmjs.com/files/package.json#dependencies
Tilde~匹配次要版本,如果你已经安装了1.4.2的软件包,安装后,如果在你的package.json中它也可以用作版本1.4.3和1.4.4,那么它将被用作~1.4.2然后npm install在升级后的项目中,将在项目中安装1.4.4.但是该软件包有1.5.0可用,然后它不会被〜安装.它被称为次要版本.
Caret ^匹配主要版本,如果你的项目停止1.4.2包,1.5.0也可用,那么^将安装主版本.如果你有^ 1.4.2,它将不允许安装2.1.0 .
固定版本,如果你不想在每次安装时更改软件包的版本,那么使用固定版本没有任何特殊字符,例如"1.4.2"
最新版本*如果您想安装最新版本,请仅在包名前面使用*.
〜蒂尔德:
~
修复主要和次要数字.
当您准备接受依赖项中的错误修复但不希望任何可能不兼容的更改时,可以使用它.
代字号与最新的次要版本(中间数字)匹配.
~1.2.3将匹配所有1.2.x版本,但它将错过1.3.0.
Tilde(〜)为您提供错误修复版本
^插入:
^
仅修复主要数字.
当您仔细观察您的依赖项并且准备好快速更改代码时,如果次要版本不兼容,则会使用它.
它会将您更新为最新的主要版本(第一个数字).
^ 1.2.3将匹配包括1.3.0在内的任何1.xx版本,但它将在2.0.0上推迟.
Caret(^)也为您提供向后兼容的新功能.
一个班轮解释
标准版本控制系统是major.minor.build(例如2.4.1)
npm根据这些字符检查并修复特定包的版本
〜:主要版本是固定的,次要版本是固定的,匹配任何版本号
例如:~2.4.1意味着它将检查2.4.x,其中x是任何东西
^:主要版本已修复,匹配任何次要版本,匹配任何内部版本号
例如:^ 2.4.1表示它将检查2.xx,其中x是任何东西
您可能已经在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
提尔德(〜)
主要版本是固定的,次要版本是固定的,匹配任何内部版本号
"express": "~4.13.3"
~4.13.3
表示它将检查4.13.x,其中x为任意值和4.14.0
脱字号(^)
主要版本是固定的,匹配任何次要版本,匹配任何内部版本号
"supertest": "^3.0.0"
^3.0.0
表示它将检查3.xx,其中x为任意值