我已经升级到最新的稳定后node
和npm
,我试过npm install moment --save
。它将条目保存在package.json
带有脱^
字符号前缀的中。以前,它是一个波浪号~
前缀。
- 为什么要进行这些更改
npm
? - tilde
~
和caret有^
什么区别? - 与其他相比有什么优势?
我已经升级到最新的稳定后node
和npm
,我试过npm install moment --save
。它将条目保存在package.json
带有脱^
字符号前缀的中。以前,它是一个波浪号~
前缀。
npm
?~
和caret有^
什么区别?Answers:
〜version“大约等同于版本”将把您更新到所有将来的补丁程序版本,而不会增加次要版本。~1.2.3
将使用从1.2.3到<1.3.0的发行版。
^ version“与版本兼容”将在不增加主要版本的情况下将您更新为所有将来的次要/修补程序版本。^2.3.4
将使用从2.3.4到<3.0.0的发行版。
请参阅下面的评论。
^
或a ~
。如果您想对版本进行严格控制,请设置此选项: npm config set save-prefix=''
0.2.x
,2
是不是major version
。这就是docs.npmjs.com使用特定词的原因the left-most non-zero digit
。同样关于这种情况:^ 0.0.4表示0.0.4
A
在3个版本:0.0.1
,0.0.2
和0.0.3
。有个bug,0.0.1
因此您至少0.0.2
要包装在包装中B
。如果您编写0.0.x
,将得到0.0.3
,这是确定的。但是,如果某些其他软件包同时C
需要B
和A
并具有约束,"A": "<0.0.2"
那么您将0.0.1
不会显示任何冲突问题,而这不是您想要的。使用波浪号~0.0.2
应该可以帮助您避免此问题。
我还想添加官方的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-插入符号范围和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标签的软件包
1.2.0 || >=1.2.2 <1.3.0
:确切为1.2.0,或从1.2.2到1.3.0(包括两端)的所有内容,但不包括1.2.1,或1.3.1及更高版本,也不是1.1 .x及以下。
"Approximately equivalent to version"
并且"Compatible with version"
是描述〜和^行为的令人沮丧的非特定方式。感谢@jgillich提供实际答案!
npm允许安装比指定版本更新的软件包。使用代字号(~
)可为您提供错误修复版本,而插入符号(^
)也可为您提供向后兼容的新功能。
问题在于旧版本通常不会收到太多的错误修复,因此npm使用caret(^
)作为默认值--save
。
根据:“ Semver解释了-为什么我的package.json中有插入符号(^)?” 。
请注意,规则适用于1.0.0以上的版本,并非每个项目都遵循语义版本控制。对于版本0.xx,插入记号仅允许更新修补程序,即,其行为与代字号相同。请参阅“范围”
这是概念的直观说明:
来源:“语义版本控制速查表”。
<major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2
1.2.3
。^
(如头部)。允许从左侧的第二个非零级别进行更新:^0.2.3
Means 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
,它会冻结所有主要/次要/补丁程序级别。
~
修正主要和次要数字。当您准备接受依赖项中的错误修复但不希望任何潜在的不兼容更改时,可以使用它。
^
仅固定主号码。当您密切关注依赖关系并准备好在次要版本不兼容时准备快速更改代码时,可以使用它。
除此之外,^
是不支持由旧版本的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
^0.1.3
只接受版本0.1.x
,而不会接受0.2.0
。此行为等效于~0.1.3
。出现这种现象的原因是由于零发布软件包仍然被认为是不稳定的。用semver.org#4 的话来说,“任何内容都可能随时更改”(包括向后不兼容的更改)。
^
是1. [any]。[any](最新的次要版本)
~
是1.2。[any](最新的补丁)
一个伟大的读取是这个博客帖子上semver如何适用于NPM
和他们在做什么,使之匹配的semver标准
http://blog.npmjs.org/post/98131109725/npm-2-0-0
帽子匹配可能会被认为“已损坏”,因为它不会更新^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.
〜蒂尔德:
~
冻结主要和次要数字。^脱字号:
^
仅冻结主号码。Tilde〜匹配次要版本,如果您安装了具有1.4.2的软件包,并且在安装后,如果在package.json中将其用作〜1.4.2,则还可以使用版本1.4.3和1.4.4,然后npm install在升级后的项目中将在项目中安装1.4.4。但是该软件包有1.5.0可用,因此〜不会安装。它称为次要版本。
插入符^匹配主要版本,如果在项目中安装了1.4.2软件包,并且在发布1.5.0版本之后,则^将安装主要版本。如果您具有^ 1.4.2,则将不允许安装2.1.0 。
固定版本,如果您不想在每次安装时都更改软件包的版本,则使用不带任何特殊字符的固定版本,例如“ 1.4.2”
最新版本*如果要安装最新版本,则仅在软件包名称前使用*。
您可能已经在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
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
提尔德(〜)
主要版本是固定的,次要版本是固定的,匹配任何内部版本号
"express": "~4.13.3"
~4.13.3
表示它将检查4.13.x,其中x为任意值和4.14.0
脱字号(^)
主要版本是固定的,匹配任何次要版本,匹配任何内部版本号
"supertest": "^3.0.0"
^3.0.0
表示它将检查3.xx,其中x为任意值
版本号采用的语法表示每个部分的含义不同。语法分为三部分,用点分隔。
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.0.4,请使用以下语法:
有关语义版本语法的更多信息,请参见npm semver计算器。
npm文档中的更多内容关于语义版本控制
本质上,这不是一个答案,但似乎被忽略了。
克拉范围的说明:
参见: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中没有要求数字字段为一位数字的内容。
〜特定于次要版本^指定主要版本
例如,如果软件包版本为4.5.2,则在更新〜4.5.2时将安装最新的4.5.x版本(主版本)^ 4.5.2将安装最新的4.xx版本(主版本)
与此问题相关,您可以查看有关版本的Composer文档,但简而言之:
因此,使用Tilde,您将获得补丁程序的自动更新,但次要和主要版本将不会更新。但是,如果使用Caret,则将获得补丁程序和次要版本,但不会获得主版本(重大更改)。
Tilde版本被认为是“更安全”的方法,但是,如果您使用可靠的依赖项(维护良好的库),则Caret版本应该不会有任何问题(因为较小的更改不应破坏更改)。
npm config set save-prefix=''
。(~
如果那是您喜欢的话,请在引号中粘贴。)我亲自执行此操作,并包装生产中的东西。