package.json中的tilde(〜)和caret(^)有什么区别?
在我升级到最新的稳定node
和npm
,我尝试了npm install moment --save
。 它用caret(^)
前缀保存package.json
的条目。 以前,这是一个tilde(~)
前缀。
- 为什么这些更改是在
npm
? -
tilde(~)
和caret(^)
之间的区别是什么? - 有什么比别人更有优势?
用最简单的术语来说,代字符与最近的次版本(中间数字)匹配。 〜1.2.3将匹配所有的1.2.x版本,但会错过1.3.0。
另一方面,插入符号更轻松。 它会将您更新到最新的主要版本(第一个数字)。 ^ 1.2.3将匹配包括1.3.0在内的任何1.xx版本,但会在2.0.0版本上延期。
http://fredkschott.com/post/2014/02/npm-no-longer-defaults-to-tildes/
我想添加官方的npmjs文档以及描述所有版本特性的方法,包括问题中提到的那些 –
https://www.npmjs.org/doc/files/package.json.html
https://docs.npmjs.com/misc/semver#x-ranges-12x-1x-12-
-
~version
“大致相当于版本”请参阅npm semver – Tilde范围 & semver(7) -
^version
“与版本兼容”见npm semver – 插页 范围 & semver(7) -
version
必须完全匹配版本 -
>version
必须大于版本 -
>=version
等 -
<version
-
<=version
-
1.2.x
1.2.0,1.2.1等,但不是1.3.0 -
http://sometarballurl
(这可能是将在本地下载和安装的tarball的URL -
*
匹配任何版本 -
latest
获得最新版本
以上列表并不详尽。 其他版本说明符包括GitHuburl和GitHub用户回购,具有特定npm标签的本地path和包
Npm允许安装比指定的更新版本的软件包。 使用波浪号(〜)可以为您提供错误修复版本和插入符号(^),以及向后兼容的新function。
问题是旧版本通常不会收到错误修复那么多,所以npm使用脱字号(^)作为--save
的默认值。
根据: “Semver解释 – 为什么我的package.json中有一个插入符号(^)?” 。
请注意,这些规则适用于1.0.0以上的版本,并不是每个项目都遵循语义版本控制。
以下是对这些概念的视觉解释:
资料来源: “Semantic Versioning Cheatsheet” 。
修正主要和次要的数字。 当您准备好接受依赖项中的错误修复时,会使用它,但不希望发生任何可能不兼容的更改。
^
修正主号码。 当您密切关注您的依赖关系时可以使用它,并准备好在次要版本不兼容的情况下快速更改代码。
除此之外,旧的npm版本不支持 ^
,应谨慎使用。
所以, ^
是一个很好的默认,但并不完美。 我build议仔细挑选和configuration对您最有用的semver运算符。
Semver
<major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2
- 使用npm semver计算器进行testing。 (虽然对^的解释(包括大于同一主要范围内的特定版本的所有内容)和〜(包括大于相同次要范围内的特定版本的所有内容)不是100%正确的,但计算器似乎工作正常)
- 或者,使用SemVer Check ,而不要求您select一个包并提供解释。
允许或禁止更改
- 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
- 您可以设置起始主要版本而不指定子目录。
- 开始省略级别版本始终为
所有(希望)的可能性
设置开始主要级别并允许向上更新
* 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
注意 :缺less主要的,次要的,补丁或指定没有编号的beta
,与缺less的级别相同。
注意 :当你安装包含0
作为主要级别的pakckage时,update只会安装新的beta / pr级别的版本! 这是因为npm
在package.json
中将^
设置为默认值,当安装的版本类似于0.1.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
^
是1. [任何]。[任何](最新次要版本)
~
是1.2。[任何](最新补丁)
这篇博文是关于如何将semver应用于npm的
以及他们在做什么来使其符合semver标准
http://blog.npmjs.org/post/98131109725/npm-2-0-0
帽子匹配可能被认为是“破”,因为它不会更新^0.1.2
到0.2.0
。 当软件出现时使用0.xy
版本和帽子匹配将只匹配最后变化的数字( y
)。 这是有目的的完成的。 原因是,软件在快速发展的同时,API也发生了变化:有一天你有了这些方法,而有一天你有了这些方法,而旧的方法不见了。 如果你不想破坏已经使用你的库的人的代码,你可以增加主要的版本:例如1.0.0
– > 2.0.0
– > 3.0.0
。 所以,当你的软件终于100%完成并且function全面的时候,它就像版本11.0.0
一样,看起来并不太有意义,而且看起来很混乱。 另一方面,如果你使用的是0.1.x
– > 0.2.x
– > 0.3.x
版本,那么到软件终于100%完成并且function全面的时候,它就会以版本1.0.0
forms发布, “这个版本是一个长期的服务,你可以在你的生产代码中继续使用这个版本的库,作者明天或者下个月不会改变一切,他不会放弃这个包。”
规则是:当你的软件尚未成熟时使用0.xy
版本化,当你的公开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.
一个class轮解释
标准的版本控制系统是major.minor.build(例如2.4.1)
npm根据这些字符检查并修复特定软件包的版本
〜 :主版本是固定的,次版本是固定的,匹配任何内部版本号
例如:〜2.4.1意味着它将检查2.4.x,其中x是任何东西
^ :主版本是固定的,匹配任何次要版本,匹配任何内部版本号
例如:^ 2.4.1表示它将检查2.xx,其中x是任何东西
〜蒂尔德:
- 修正主要和次要的数字。
- 当您准备好接受依赖项中的错误修复时,会使用它,但不希望发生任何可能不兼容的更改。
- 代字符与最新的次要版本 (中间数字)匹配。
- 〜1.2.3会匹配所有的1.2.x版本,但是会错过1.3.0。
- Tilde(〜)给你错误修复版本
^插入符号:
-
^
修正主号码。 - 当您密切关注您的依赖关系时可以使用它,并准备好在次要版本不兼容的情况下快速更改代码。
- 它会将您更新到最新的主要版本 (第一个数字)。
- ^ 1.2.3将匹配包括1.3.0在内的任何1.xx版本,但会在2.0.0版本上延期。
- Caret(^)也为您提供向后兼容的新function。
^:接受版本更改小于最左非零版本(从左侧第一个非零版本数字)。
〜:接受版本变化低于第二个最左非零版本(从左侧第二个非零版本数字)。 或者如果没有第二个最左边的非零版本,则接受版本变化小于最左边的版本。