Fiz*_*han 3111 node.js npm semantic-versioning package.json
我已经升级到最新的稳定后node
和npm
,我试过npm install moment --save
.它package.json
使用^
前缀保存条目.以前,它是一个~
前缀.
npm
?~
和之间有什么区别^
?jgi*_*ich 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/
请注意,作者的术语有些误导:当他说"最近的次要版本"时,他的意思是" 指定次要版本中最新的补丁版本".类似地,对于^,"最新的主要版本"应该被理解为" 指定主要版本中的最新次要版本".
Ahm*_*mad 792
我想添加官方的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.0http://sometarballurl
(这可能是将在本地下载和安装的tarball的URL*
匹配任何版本latest
获得最新版本以上列表并非详尽无遗.其他版本说明符包括GitHub网址和GitHub用户存储库,本地路径和包含特定npm标记的包
psp*_*spi 545
Npm允许安装比指定版本更新的软件包版本.使用tilde(~
)为您提供错误修复版本,而caret(^
)也为您提供向后兼容的新功能.
问题是旧版本通常不会收到太多错误修复,所以npm使用caret(^
)作为默认值--save
.
根据:"Semver解释 - 为什么我的package.json中有一个插入符号(^)?" .
请注意,规则适用于1.0.0以上的版本,并非每个项目都遵循语义版本.对于0.xx版本,插入符号仅允许修补程序更新,即它的行为与代字号相同.见"Caret Ranges"
这是对概念的直观解释:
资料来源:"Semantic Versioning Cheatsheet".
rof*_*rol 95
<major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
冻结主要级别
~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
Run Code Online (Sandbox Code Playgroud)
冻结小级别
^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
Run Code Online (Sandbox Code Playgroud)
冻结补丁级别
~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)
Run Code Online (Sandbox Code Playgroud)
禁止更新
1.2.3 1.2.3
^0.0.3 (0.0.3) 0.0.3
Run Code Online (Sandbox Code Playgroud)
注意:缺少主要,次要,补丁或指定beta
没有数字,any
与缺失的级别相同.
注意:当您安装具有0
主要级别的软件包时,更新将仅安装新的beta/pr级版本!这是因为npm
设置^
为默认设置package.json
,当安装版本时0.1.3
,它会冻结所有主要/次要/补丁级别.
ale*_*lex 87
~
修复主要和次要数字.当您准备接受依赖项中的错误修复但不希望任何可能不兼容的更改时,可以使用它.
^
仅修复主要数字.当您仔细观察您的依赖项并且准备好快速更改代码时,如果次要版本不兼容,则会使用它.
除此之外,^
是不支持由旧版本的NPM,并应谨慎使用.
所以,这^
是一个很好的默认,但它并不完美.我建议您仔细挑选和配置对您最有用的semver运算符.
hao*_*ang 55
~
:合理接近至
~1.1.5: 1.1.0 <= accepted < 1.2.0
Run Code Online (Sandbox Code Playgroud)
^
:兼容与
^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
Run Code Online (Sandbox Code Playgroud)
Ela*_*ode 33
插入符 ^
包括同一主要范围中大于特定版本的所有内容。
波形符 ~
包括同一次要范围内大于特定版本的所有内容。
例如,要指定最高 1.0.4 的可接受版本范围,请使用以下语法:
\n有关语义版本控制语法的更多信息,请参阅npm semver 计算器。
\n\n更多来自 npm 文档关于语义版本控制
\nWil*_*ern 29
^
是1. [any].[any](最新的次要版本)
~
是1.2.[any](最新补丁)
一个伟大的读取是这个博客帖子上semver如何适用于NPM
和他们在做什么,使之匹配的semver标准
http://blog.npmjs.org/post/98131109725/npm-2-0-0
asd*_*ads 27
帽子匹配可以被认为是"破",因为它不会更新^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.
Run Code Online (Sandbox Code Playgroud)
Lax*_*xmi 21
〜蒂尔德:
~
修复主要和次要数字.^插入:
^
仅修复主要数字.Avi*_*ash 14
一个班轮解释
标准版本控制系统是major.minor.build(例如2.4.1)
npm根据这些字符检查并修复特定包的版本
〜:主要版本是固定的,次要版本是固定的,匹配任何版本号
例如:~2.4.1意味着它将检查2.4.x,其中x是任何东西
^:主要版本已修复,匹配任何次要版本,匹配任何内部版本号
例如:^ 2.4.1表示它将检查2.xx,其中x是任何东西
Mud*_*sir 12
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"
最新版本*如果您想安装最新版本,请仅在包名前面使用*.
小智 11
您可能已经在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
小智 7
semver 分为 3 个主要部分,由点分隔。
major.minor.patch
1.0.0
Run Code Online (Sandbox Code Playgroud)
这些不同的主要、次要和补丁用于标识不同的版本。潮汐 (~) 和插入符号 (^) 用于标识要在包版本控制中使用的次要版本和补丁版本。
~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
Run Code Online (Sandbox Code Playgroud)
与这个问题相关,您可以查看有关 versions 的 Composer 文档,但简而言之:
因此,使用Tilde,您将获得补丁的自动更新,但次要版本和主要版本不会更新。但是,如果您使用Caret,您将获得补丁和次要版本,但不会获得主要(重大更改)版本。
波浪线版本被认为是“更安全”的方法,但是如果您使用可靠的依赖项(维护良好的库),那么插入符号版本不应该有任何问题(因为微小的更改不应该是重大更改。
您可能应该查看这篇关于 Composer install 和 Composer update 之间差异的 stackoverflow 帖子。
提尔德(〜)
主要版本是固定的,次要版本是固定的,匹配任何内部版本号
"express": "~4.13.3"
Run Code Online (Sandbox Code Playgroud)
~4.13.3
表示它将检查4.13.x,其中x为任意值和4.14.0
脱字号(^)
主要版本是固定的,匹配任何次要版本,匹配任何内部版本号
"supertest": "^3.0.0"
Run Code Online (Sandbox Code Playgroud)
^3.0.0
表示它将检查3.xx,其中x为任意值
这本身并不是一个答案,而是一个似乎被忽视的观察结果。
插入符号范围的描述:
请参阅: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 中没有任何内容要求数字字段为单位数。
例如,对于:~1.8.0,您将匹配所有 1.8.x 版本,但您将丢失 1.9.0(这是默认行为)。
例如:^1.8.0 您将更新到最新的主要版本(第一期)。任何 1.xx 版本,包括 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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
694366 次 |
最近记录: |